create_token.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package utils
  2. import (
  3. "errors"
  4. beego "github.com/beego/beego/v2/server/web"
  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. jwt.RegisteredClaims
  12. }
  13. const TokenExpireDuration = time.Hour * 72
  14. var Serect string
  15. func CreateToken(userId uint, userName string) (string, error) {
  16. Issuer, _ := beego.AppConfig.String("Issuer")
  17. Serect, _ = beego.AppConfig.String("mySerect")
  18. claims := MyClaims{
  19. UserId: userId,
  20. UserName: userName,
  21. RegisteredClaims: jwt.RegisteredClaims{
  22. ExpiresAt: jwt.NewNumericDate(time.Now().Add(TokenExpireDuration)),
  23. Issuer: Issuer,
  24. },
  25. }
  26. var mySerect = []byte(Serect)
  27. token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
  28. return token.SignedString(mySerect)
  29. }
  30. func ParseToken(tokenStr string) (*MyClaims, error) {
  31. // 使用全局配置中的密钥对token进行解析。
  32. var mySecret = []byte(Serect)
  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, errors.New("无效的签名或密钥")
  41. } else if ve, ok := err.(*jwt.ValidationError); ok && ve.Errors&jwt.ValidationErrorExpired != 0 {
  42. return nil, errors.New("令牌已过期")
  43. }
  44. return nil, err
  45. }
  46. // 验证令牌是否有效。
  47. if !token.Valid {
  48. return nil, errors.New("无效的令牌")
  49. }
  50. // 如果令牌有效,则返回解析出的声明信息。
  51. return claims, nil
  52. }