package middleware import ( "app/commons/core" "github.com/gin-gonic/gin" "net/http" "time" ) const AuthorizationHeader = "Authorization" // JwtMiddleware JWT中间件, 强制要求用户登录 func JwtMiddleware() gin.HandlerFunc { return func(c *gin.Context) { tokenString := c.GetHeader(AuthorizationHeader) if tokenString == "" { core.Log.Info("未携带token") c.AbortWithStatusJSON(http.StatusUnauthorized, core.ResponseMissAuthToken) return } // 解析JWT member, err := ParseJWT(tokenString) //core.Log.Infof("member:%+v", member) if err != nil || member == nil || member.ExpiresAt.Time.Before(time.Now()) { c.AbortWithStatusJSON(http.StatusUnauthorized, core.ResponseTokenInvalid) return } // token有效,设置用户信息到上下文 setClaimsToContext(c, member) // 继续执行 c.Next() } } // setClaimsToContext 设置用户信息到上下文 func setClaimsToContext(c *gin.Context, member *MyClaims) { c.Set("userId", member.UserID) c.Set("uid", member.Uid) c.Set("openId", member.OpenId) c.Set("exp", member.ExpiresAt) c.Set("issuer", member.Issuer) } // OptionalJwtMiddleware 允许用户携带 JWT,但不强制要求登录 func OptionalJwtMiddleware() gin.HandlerFunc { return func(c *gin.Context) { tokenString := c.GetHeader(AuthorizationHeader) if tokenString != "" { // 解析JWT member, err := ParseJWT(tokenString) if err == nil { if member != nil { setClaimsToContext(c, member) } } //else { // core.Log.Infof("OptionalJwtMiddleware:%s", err.Error()) //} } c.Next() } }