user.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package user
  2. import (
  3. "github.com/0xJacky/Nginx-UI/model"
  4. "github.com/0xJacky/Nginx-UI/query"
  5. "github.com/golang-jwt/jwt/v5"
  6. "github.com/pkg/errors"
  7. "github.com/spf13/cast"
  8. "github.com/uozi-tech/cosy/logger"
  9. cSettings "github.com/uozi-tech/cosy/settings"
  10. "time"
  11. )
  12. const ExpiredTime = 24 * time.Hour
  13. type JWTClaims struct {
  14. Name string `json:"name"`
  15. UserID uint64 `json:"user_id"`
  16. jwt.RegisteredClaims
  17. }
  18. func GetUser(name string) (user *model.User, err error) {
  19. db := model.UseDB()
  20. user = &model.User{}
  21. err = db.Where("name", name).First(user).Error
  22. if err != nil {
  23. return
  24. }
  25. return
  26. }
  27. func DeleteToken(token string) {
  28. q := query.AuthToken
  29. _, _ = q.Where(q.Token.Eq(token)).Delete()
  30. }
  31. func GetTokenUser(token string) (*model.User, bool) {
  32. _, err := ValidateJWT(token)
  33. if err != nil {
  34. logger.Error(err)
  35. return nil, false
  36. }
  37. q := query.AuthToken
  38. authToken, err := q.Where(q.Token.Eq(token)).First()
  39. if err != nil {
  40. return nil, false
  41. }
  42. if authToken.ExpiredAt < time.Now().Unix() {
  43. DeleteToken(token)
  44. return nil, false
  45. }
  46. u := query.User
  47. user, err := u.FirstByID(authToken.UserID)
  48. return user, err == nil
  49. }
  50. func GenerateJWT(user *model.User) (string, error) {
  51. now := time.Now()
  52. claims := JWTClaims{
  53. Name: user.Name,
  54. UserID: user.ID,
  55. RegisteredClaims: jwt.RegisteredClaims{
  56. ExpiresAt: jwt.NewNumericDate(now.Add(ExpiredTime)),
  57. IssuedAt: jwt.NewNumericDate(now),
  58. NotBefore: jwt.NewNumericDate(now),
  59. Issuer: "Nginx UI",
  60. Subject: user.Name,
  61. ID: cast.ToString(user.ID),
  62. },
  63. }
  64. unsignedToken := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
  65. signedToken, err := unsignedToken.SignedString([]byte(cSettings.AppSettings.JwtSecret))
  66. if err != nil {
  67. return "", err
  68. }
  69. q := query.AuthToken
  70. err = q.Create(&model.AuthToken{
  71. UserID: user.ID,
  72. Token: signedToken,
  73. ExpiredAt: now.Add(ExpiredTime).Unix(),
  74. })
  75. if err != nil {
  76. return "", err
  77. }
  78. return signedToken, err
  79. }
  80. func ValidateJWT(tokenStr string) (claims *JWTClaims, err error) {
  81. if tokenStr == "" {
  82. err = errors.New("token is empty")
  83. return
  84. }
  85. token, err := jwt.ParseWithClaims(tokenStr, &JWTClaims{}, func(token *jwt.Token) (interface{}, error) {
  86. return []byte(cSettings.AppSettings.JwtSecret), nil
  87. })
  88. if err != nil {
  89. return
  90. }
  91. var ok bool
  92. if claims, ok = token.Claims.(*JWTClaims); ok && token.Valid {
  93. return claims, nil
  94. }
  95. return nil, errors.New("invalid claims type")
  96. }