token.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package utils
  2. import (
  3. "errors"
  4. "go-nc/configs/global"
  5. "time"
  6. "github.com/golang-jwt/jwt/v5"
  7. )
  8. var TokenExpired = 886
  9. type UserInfo struct {
  10. Id uint `json:"id"` // 用户ID
  11. UserName string `json:"username"` // 用户名
  12. UserType string `json:"user_type"` // 用户类型
  13. }
  14. type MyClaims struct {
  15. User UserInfo
  16. jwt.RegisteredClaims // 标准Claims结构体,可设置8个标准字段
  17. }
  18. // 解析token
  19. func ParseToken(tokenString string) (*MyClaims, error) {
  20. claims := &MyClaims{}
  21. _, err := jwt.ParseWithClaims(tokenString, claims, func(t *jwt.Token) (interface{}, error) {
  22. return []byte(global.App.Config.App.JwtSecret), nil
  23. })
  24. return claims, err
  25. }
  26. // 登录成功后调用,传入UserInfo结构体
  27. func GenerateToken(userInfo UserInfo) (string, error) {
  28. expirationTime := time.Now().Add(time.Duration(global.App.Config.App.TokenExpireDuration) * time.Second) // 两个小时有效期
  29. claims := &MyClaims{
  30. User: userInfo,
  31. RegisteredClaims: jwt.RegisteredClaims{
  32. ExpiresAt: jwt.NewNumericDate(expirationTime),
  33. Issuer: "go-nc", // 签发者
  34. },
  35. }
  36. // 生成Token,指定签名算法和claims
  37. token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
  38. // 签名
  39. if tokenString, err := token.SignedString([]byte(global.App.Config.App.JwtSecret)); err != nil {
  40. return "", err
  41. } else {
  42. return tokenString, nil
  43. }
  44. }
  45. // 续签token
  46. func RenewToken(claims *MyClaims) (string, error) {
  47. // 若token过期不超过10分钟则给它续签
  48. if withinLimit(claims.ExpiresAt.Unix(), 600) {
  49. return GenerateToken(claims.User)
  50. }
  51. return "", errors.New("登录已过期")
  52. }
  53. // 计算过期时间是否超过l
  54. func withinLimit(s int64, l int64) bool {
  55. e := time.Now().Unix()
  56. return e-s < l
  57. }