Skip to content

v1.2.7

Choose a tag to compare

@ixugo ixugo released this 23 Jun 08:09

增加 token 领域,使用方法

  1. 在发放 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
	}
  1. 在验证 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()
	}
}