123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- package utils
- import (
- "errors"
- "go-nc/configs/global"
- "time"
- "github.com/golang-jwt/jwt/v5"
- )
- var TokenExpired = 886
- type UserInfo struct {
- Id uint `json:"id"` // 用户ID
- UserName string `json:"username"` // 用户名
- UserType string `json:"user_type"` // 用户类型
- }
- type MyClaims struct {
- User UserInfo
- jwt.RegisteredClaims // 标准Claims结构体,可设置8个标准字段
- }
- // 解析token
- func ParseToken(tokenString string) (*MyClaims, error) {
- claims := &MyClaims{}
- _, err := jwt.ParseWithClaims(tokenString, claims, func(t *jwt.Token) (interface{}, error) {
- return []byte(global.App.Config.App.JwtSecret), nil
- })
- return claims, err
- }
- // 登录成功后调用,传入UserInfo结构体
- func GenerateToken(userInfo UserInfo) (string, error) {
- expirationTime := time.Now().Add(time.Duration(global.App.Config.App.TokenExpireDuration) * time.Second) // 两个小时有效期
- claims := &MyClaims{
- User: userInfo,
- RegisteredClaims: jwt.RegisteredClaims{
- ExpiresAt: jwt.NewNumericDate(expirationTime),
- Issuer: "go-nc", // 签发者
- },
- }
- // 生成Token,指定签名算法和claims
- token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
- // 签名
- if tokenString, err := token.SignedString([]byte(global.App.Config.App.JwtSecret)); err != nil {
- return "", err
- } else {
- return tokenString, nil
- }
- }
- // 续签token
- func RenewToken(claims *MyClaims) (string, error) {
- // 若token过期不超过10分钟则给它续签
- if withinLimit(claims.ExpiresAt.Unix(), 600) {
- return GenerateToken(claims.User)
- }
- return "", errors.New("登录已过期")
- }
- // 计算过期时间是否超过l
- func withinLimit(s int64, l int64) bool {
- e := time.Now().Unix()
- return e-s < l
- }
|