jwt.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package auth
  2. import (
  3. "errors"
  4. "time"
  5. "perms-system-server/internal/consts"
  6. "perms-system-server/internal/middleware"
  7. "github.com/golang-jwt/jwt/v4"
  8. )
  9. var ErrTokenTypeMismatch = errors.New("token type mismatch")
  10. type RefreshClaims struct {
  11. TokenType string `json:"tokenType"`
  12. UserId int64 `json:"userId"`
  13. ProductCode string `json:"productCode"`
  14. TokenVersion int64 `json:"tokenVersion"`
  15. jwt.RegisteredClaims
  16. }
  17. func GenerateAccessToken(secret string, expireSeconds int64, userId int64, username, productCode, memberType string, tokenVersion int64) (string, error) {
  18. now := time.Now()
  19. claims := middleware.Claims{
  20. TokenType: consts.TokenTypeAccess,
  21. UserId: userId,
  22. Username: username,
  23. ProductCode: productCode,
  24. MemberType: memberType,
  25. TokenVersion: tokenVersion,
  26. RegisteredClaims: jwt.RegisteredClaims{
  27. ExpiresAt: jwt.NewNumericDate(now.Add(time.Duration(expireSeconds) * time.Second)),
  28. IssuedAt: jwt.NewNumericDate(now),
  29. },
  30. }
  31. token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
  32. return token.SignedString([]byte(secret))
  33. }
  34. func GenerateRefreshToken(secret string, expireSeconds int64, userId int64, productCode string, tokenVersion int64) (string, error) {
  35. now := time.Now()
  36. claims := RefreshClaims{
  37. TokenType: consts.TokenTypeRefresh,
  38. UserId: userId,
  39. ProductCode: productCode,
  40. TokenVersion: tokenVersion,
  41. RegisteredClaims: jwt.RegisteredClaims{
  42. ExpiresAt: jwt.NewNumericDate(now.Add(time.Duration(expireSeconds) * time.Second)),
  43. IssuedAt: jwt.NewNumericDate(now),
  44. },
  45. }
  46. token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
  47. return token.SignedString([]byte(secret))
  48. }
  49. func ParseRefreshToken(tokenStr, secret string) (*RefreshClaims, error) {
  50. token, err := jwt.ParseWithClaims(tokenStr, &RefreshClaims{}, func(token *jwt.Token) (interface{}, error) {
  51. return []byte(secret), nil
  52. })
  53. if err != nil {
  54. return nil, err
  55. }
  56. claims, ok := token.Claims.(*RefreshClaims)
  57. if !ok || !token.Valid {
  58. return nil, jwt.ErrSignatureInvalid
  59. }
  60. if claims.TokenType != consts.TokenTypeRefresh {
  61. return nil, ErrTokenTypeMismatch
  62. }
  63. return claims, nil
  64. }