jwt.go 2.0 KB

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