1
0

auth.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package user
  2. import (
  3. "github.com/0xJacky/Nginx-UI/api"
  4. "github.com/0xJacky/Nginx-UI/model"
  5. "net/http"
  6. "time"
  7. "github.com/gin-gonic/gin"
  8. "golang.org/x/crypto/bcrypt"
  9. )
  10. type LoginUser struct {
  11. Name string `json:"name" binding:"required,max=255"`
  12. Password string `json:"password" binding:"required,max=255"`
  13. }
  14. type LoginResponse struct {
  15. Message string `json:"message"`
  16. Token string `json:"token"`
  17. }
  18. func Login(c *gin.Context) {
  19. var user LoginUser
  20. ok := api.BindAndValid(c, &user)
  21. if !ok {
  22. return
  23. }
  24. u, _ := model.GetUser(user.Name)
  25. if err := bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(user.Password)); err != nil {
  26. time.Sleep(5 * time.Second)
  27. c.JSON(http.StatusForbidden, gin.H{
  28. "message": "The username or password is incorrect",
  29. })
  30. return
  31. }
  32. token, err := model.GenerateJWT(u.Name)
  33. if err != nil {
  34. c.JSON(http.StatusInternalServerError, gin.H{
  35. "message": err.Error(),
  36. })
  37. return
  38. }
  39. c.JSON(http.StatusOK, LoginResponse{
  40. Message: "ok",
  41. Token: token,
  42. })
  43. }
  44. func Logout(c *gin.Context) {
  45. token := c.GetHeader("Authorization")
  46. if token != "" {
  47. err := model.DeleteToken(token)
  48. if err != nil {
  49. c.JSON(http.StatusInternalServerError, gin.H{
  50. "message": err.Error(),
  51. })
  52. return
  53. }
  54. }
  55. c.JSON(http.StatusNoContent, nil)
  56. }