auth.go 1.1 KB

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