user.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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/v4"
  6. "github.com/pkg/errors"
  7. "github.com/uozi-tech/cosy/logger"
  8. cSettings "github.com/uozi-tech/cosy/settings"
  9. "strings"
  10. "time"
  11. )
  12. const ExpiredTime = 24 * time.Hour
  13. type JWTClaims struct {
  14. Name string `json:"name"`
  15. UserID int `json:"user_id"`
  16. jwt.StandardClaims
  17. }
  18. func BuildCacheTokenKey(token string) string {
  19. var sb strings.Builder
  20. sb.WriteString("token:")
  21. sb.WriteString(token)
  22. return sb.String()
  23. }
  24. func GetUser(name string) (user *model.User, err error) {
  25. db := model.UseDB()
  26. user = &model.User{}
  27. err = db.Where("name", name).First(user).Error
  28. if err != nil {
  29. return
  30. }
  31. return
  32. }
  33. func DeleteToken(token string) {
  34. q := query.AuthToken
  35. _, _ = q.Where(q.Token.Eq(token)).Delete()
  36. }
  37. func GetTokenUser(token string) (*model.User, bool) {
  38. q := query.AuthToken
  39. authToken, err := q.Where(q.Token.Eq(token)).First()
  40. if err != nil {
  41. return nil, false
  42. }
  43. if authToken.ExpiredAt < time.Now().Unix() {
  44. DeleteToken(token)
  45. return nil, false
  46. }
  47. u := query.User
  48. user, err := u.FirstByID(authToken.UserID)
  49. return user, err == nil
  50. }
  51. func GenerateJWT(user *model.User) (string, error) {
  52. claims := JWTClaims{
  53. Name: user.Name,
  54. UserID: user.ID,
  55. StandardClaims: jwt.StandardClaims{
  56. ExpiresAt: time.Now().Add(ExpiredTime).Unix(),
  57. },
  58. }
  59. unsignedToken := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
  60. signedToken, err := unsignedToken.SignedString([]byte(cSettings.AppSettings.JwtSecret))
  61. if err != nil {
  62. return "", err
  63. }
  64. q := query.AuthToken
  65. err = q.Create(&model.AuthToken{
  66. UserID: user.ID,
  67. Token: signedToken,
  68. ExpiredAt: time.Now().Add(ExpiredTime).Unix(),
  69. })
  70. if err != nil {
  71. return "", err
  72. }
  73. return signedToken, err
  74. }
  75. func ValidateJWT(token string) (claims *JWTClaims, err error) {
  76. if token == "" {
  77. err = errors.New("token is empty")
  78. return
  79. }
  80. unsignedToken, err := jwt.ParseWithClaims(
  81. token,
  82. &JWTClaims{},
  83. func(token *jwt.Token) (interface{}, error) {
  84. return []byte(cSettings.AppSettings.JwtSecret), nil
  85. },
  86. )
  87. if err != nil {
  88. err = errors.New("parse with claims error")
  89. return
  90. }
  91. claims, ok := unsignedToken.Claims.(*JWTClaims)
  92. if !ok {
  93. err = errors.New("convert to jwt claims error")
  94. return
  95. }
  96. if claims.ExpiresAt < time.Now().UTC().Unix() {
  97. err = errors.New("jwt is expired")
  98. }
  99. return
  100. }
  101. func CurrentUser(token string) (u *model.User, err error) {
  102. // validate token
  103. var claims *JWTClaims
  104. claims, err = ValidateJWT(token)
  105. if err != nil {
  106. return
  107. }
  108. // get user by id
  109. user := query.User
  110. u, err = user.FirstByID(claims.UserID)
  111. if err != nil {
  112. return
  113. }
  114. logger.Info("[Current User]", u.Name)
  115. return
  116. }