Files
mayfly-go/server/pkg/req/token.go

78 lines
1.9 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package req
import (
"errors"
"mayfly-go/pkg/utils/stringx"
"time"
"github.com/golang-jwt/jwt/v5"
)
// JwtConf jwt配置
type JwtConf struct {
Key string
ExpireTime uint64 // 过期时间,单位分钟
RefreshTokenExpireTime uint64 // 刷新token的过期时间单位分钟
}
// 默认jwt配置
var jwtConf = JwtConf{
Key: stringx.RandUUID(),
ExpireTime: 60,
RefreshTokenExpireTime: 360,
}
// SetJwtConf 设置jwt配置
func SetJwtConf(conf JwtConf) {
jwtConf = conf
}
// 创建用户token
func CreateToken(userId uint64, username string) (accessToken string, refreshToken string, err error) {
now := time.Now()
// 带权限创建令牌
// 设置有效期过期需要重新登录获取token
accessJwt := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"id": userId,
"username": username,
"exp": now.Add(time.Minute * time.Duration(jwtConf.ExpireTime)).Unix(),
})
// refresh token
refreshJwt := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"id": userId,
"username": username,
"exp": now.Add(time.Minute * time.Duration(jwtConf.RefreshTokenExpireTime)).Unix(),
})
// 使用自定义字符串加密 and get the complete encoded token as a string
accessToken, err = accessJwt.SignedString([]byte(jwtConf.Key))
if err != nil {
return
}
refreshToken, err = refreshJwt.SignedString([]byte(jwtConf.Key))
return
}
// 解析token并返回登录者账号信息
func ParseToken(tokenStr string) (uint64, string, error) {
if tokenStr == "" {
return 0, "", errors.New("token error")
}
// Parse token
token, err := jwt.Parse(tokenStr, func(token *jwt.Token) (any, error) {
return []byte(jwtConf.Key), nil
})
if err != nil || token == nil {
return 0, "", err
}
if !token.Valid {
return 0, "", errors.New("token invalid")
}
i := token.Claims.(jwt.MapClaims)
return uint64(i["id"].(float64)), i["username"].(string), nil
}