create_token.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package utils
  2. import (
  3. "errors"
  4. "github.com/golang-jwt/jwt/v4"
  5. "project_management/app/e"
  6. "project_management/global"
  7. "time"
  8. )
  9. type MyClaims struct {
  10. UserId uint `json:"user_id"`
  11. UserName string `json:"user_name"`
  12. Role string `json:"role"`
  13. jwt.RegisteredClaims
  14. }
  15. const TokenExpireDuration = time.Hour * 999999
  16. func CreateToken(userId uint, userName, role string) (string, error) {
  17. claims := MyClaims{
  18. UserId: userId,
  19. UserName: userName,
  20. Role: role,
  21. RegisteredClaims: jwt.RegisteredClaims{
  22. ExpiresAt: jwt.NewNumericDate(time.Now().Add(TokenExpireDuration)),
  23. Issuer: global.JwtSetting.Issuer,
  24. },
  25. }
  26. var mySerect = []byte(global.JwtSetting.Secret)
  27. token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
  28. return token.SignedString(mySerect)
  29. }
  30. func ParseToken(tokenStr string) (*MyClaims, e.Rescode) {
  31. // 使用全局配置中的密钥对token进行解析。
  32. var mySecret = []byte(global.JwtSetting.Secret)
  33. // 尝试解析并验证JWT令牌。
  34. claims := new(MyClaims)
  35. token, err := jwt.ParseWithClaims(tokenStr, claims, func(token *jwt.Token) (interface{}, error) {
  36. return mySecret, nil
  37. })
  38. if err != nil {
  39. if errors.Is(err, jwt.ErrSignatureInvalid) || errors.Is(err, jwt.ErrInvalidKey) {
  40. return nil, e.TokenIsInvalid
  41. } else if ve, ok := err.(*jwt.ValidationError); ok && ve.Errors&jwt.ValidationErrorExpired != 0 {
  42. return nil, e.TokenIsExpired
  43. }
  44. return nil, e.TokenIsInvalid
  45. }
  46. // 验证令牌是否有效。
  47. if !token.Valid {
  48. return nil, e.TokenIsInvalid
  49. }
  50. // 如果令牌有效,则返回解析出的声明信息。
  51. return claims, e.SUCCESS
  52. }