代码拉取完成,页面将自动刷新
package jwt
import (
"errors"
"time"
"github.com/golang-jwt/jwt/v5"
"github.com/google/uuid"
"golang.org/x/sync/singleflight"
)
var (
Concurrency_Control = &singleflight.Group{}
)
func (j *jwtUtil) CreateClaims(baseClaims *BaseClaims) *CustomClaims {
bf := j.config.GetBufferTime()
ep := j.config.GetExpiresTime()
ts := time.Now()
return &CustomClaims{
BaseClaims: *baseClaims,
BufferTime: int64(bf / time.Second), // 缓冲时间, 缓冲时间内会获得新的token刷新令牌 此时一个用户会存在两个有效令牌 但是前端只留一个 另一个会丢失
RegisteredClaims: jwt.RegisteredClaims{
Audience: jwt.ClaimStrings{j.config.GetAudience()}, // 受众
NotBefore: jwt.NewNumericDate(ts.Add(-1000)), // 签名生效时间
ExpiresAt: jwt.NewNumericDate(ts.Add(ep)), // 过期时间, from配置文件
Issuer: j.config.Issuer, // 签名的发行者
IssuedAt: jwt.NewNumericDate(ts),
},
}
}
func (j *jwtUtil) CreateTokenRaw(claims *CustomClaims) (string, error) {
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
signKey := j.config.SigningKey
if signKey == "" {
return "", errors.New("jwt signing key is empty")
}
return token.SignedString([]byte(signKey))
}
// 创建一个token
func (j *jwtUtil) CreateToken(claims *CustomClaims) (string, error) {
claims.Issuer = j.config.Issuer
ep := j.config.GetExpiresTime()
if claims.ExpiresAt == nil {
expiresAt := jwt.NewNumericDate(time.Now().Add(ep))
claims.ExpiresAt = expiresAt
}
if claims.ID == "" {
claims.ID = uuid.New().String()
}
return j.CreateTokenRaw(claims)
}
// CreateTokenByOldToken 旧token 换新token 使用归并回源避免并发问题
func (j *jwtUtil) CreateTokenByOldToken(oldToken string, claims *CustomClaims) (string, error) {
v, err, _ := Concurrency_Control.Do("JWT:"+oldToken, func() (any, error) {
return j.CreateToken(claims)
})
return v.(string), err
}
// 解析 token
func (j *jwtUtil) ParseToken(jwtToken string) (claims *CustomClaims, err error) {
claims, err = ParseJwtTokenWithClaims(&jwtToken, j.config.SigningKey)
return
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。