jwt.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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, perms []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. Perms: perms,
  27. RegisteredClaims: jwt.RegisteredClaims{
  28. ExpiresAt: jwt.NewNumericDate(now.Add(time.Duration(expireSeconds) * time.Second)),
  29. IssuedAt: jwt.NewNumericDate(now),
  30. },
  31. }
  32. token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
  33. return token.SignedString([]byte(secret))
  34. }
  35. func GenerateRefreshToken(secret string, expireSeconds int64, userId int64, productCode string, tokenVersion int64) (string, error) {
  36. now := time.Now()
  37. claims := RefreshClaims{
  38. TokenType: consts.TokenTypeRefresh,
  39. UserId: userId,
  40. ProductCode: productCode,
  41. TokenVersion: tokenVersion,
  42. RegisteredClaims: jwt.RegisteredClaims{
  43. ExpiresAt: jwt.NewNumericDate(now.Add(time.Duration(expireSeconds) * time.Second)),
  44. IssuedAt: jwt.NewNumericDate(now),
  45. },
  46. }
  47. token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
  48. return token.SignedString([]byte(secret))
  49. }
  50. func ParseRefreshToken(tokenStr, secret string) (*RefreshClaims, error) {
  51. token, err := jwt.ParseWithClaims(tokenStr, &RefreshClaims{}, func(token *jwt.Token) (interface{}, error) {
  52. return []byte(secret), nil
  53. })
  54. if err != nil {
  55. return nil, err
  56. }
  57. claims, ok := token.Claims.(*RefreshClaims)
  58. if !ok || !token.Valid {
  59. return nil, jwt.ErrSignatureInvalid
  60. }
  61. if claims.TokenType != consts.TokenTypeRefresh {
  62. return nil, ErrTokenTypeMismatch
  63. }
  64. return claims, nil
  65. }