Repository navigation
v1.2.7
增加 token 领域,使用方法
- 在发放 token 时,记录到数据库
var exp orm.Time
exp.Time = time.Now().AddDate(0, 0, 3)
hash := sha256.Sum256([]byte(tokenStr))
if _, err := u.token.TokenCore.AddToken(c.Request.Context(), &token.AddTokenInput{
Hash: hash[:],
UserID: usr.Username,
Scope: "login",
ExpiredAt: exp,
}); err != nil {
return nil, err
}- 在验证 token 时,读取数据并延长 token 过期时间
// AuthMiddleware 鉴权
func AuthMiddleware(secret string, tokenAPI DelayTokener) gin.HandlerFunc {
return func(c *gin.Context) {
auth := c.Request.Header.Get("Authorization")
const prefix = "Bearer "
if len(auth) <= len(prefix) || !strings.EqualFold(auth[:len(prefix)], prefix) {
web.AbortWithStatusJSON(c, reason.ErrUnauthorizedToken.SetMsg("身份验证失败"))
return
}
tokenStr := auth[len(prefix):]
claims, err := ParseToken(tokenStr, secret)
if err != nil {
web.AbortWithStatusJSON(c, reason.ErrUnauthorizedToken.SetMsg("身份验证失败"))
return
}
// 验证过期的两种方式
if tokenAPI == nil {
// 通过 jwt 本身的过期时间验证
if err := claims.Valid(); err != nil {
web.AbortWithStatusJSON(c, reason.ErrUnauthorizedToken)
return
}
} else {
if err := tokenAPI.Valid(c.Request.Context(), tokenStr); err != nil {
web.AbortWithStatusJSON(c, reason.ErrUnauthorizedToken.SetMsg("请重新登录"))
return
}
if err := tokenAPI.DelayToken(c.Request.Context(), tokenStr, time.Now().AddDate(0, 0, 3)); err != nil {
web.AbortWithStatusJSON(c, err)
return
}
}
c.Set(uid, claims.UID)
c.Set(username, claims.Username)
c.Set(token, auth)
c.Set(level, claims.Level)
c.Next()
}
}