create_token.go 1.6 KB

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