|
|
@ -225,6 +225,7 @@ func NewGinRouter(discov discoveryregistry.SvcDiscoveryRegistry, rdb redis.Unive
|
|
|
|
return r
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// GinParseToken is a middleware that parses the token in the request header and verifies it.
|
|
|
|
func GinParseToken(rdb redis.UniversalClient) gin.HandlerFunc {
|
|
|
|
func GinParseToken(rdb redis.UniversalClient) gin.HandlerFunc {
|
|
|
|
dataBase := controller.NewAuthDatabase(
|
|
|
|
dataBase := controller.NewAuthDatabase(
|
|
|
|
cache.NewMsgCacheModel(rdb),
|
|
|
|
cache.NewMsgCacheModel(rdb),
|
|
|
@ -232,57 +233,52 @@ func GinParseToken(rdb redis.UniversalClient) gin.HandlerFunc {
|
|
|
|
config.Config.TokenPolicy.Expire,
|
|
|
|
config.Config.TokenPolicy.Expire,
|
|
|
|
)
|
|
|
|
)
|
|
|
|
return func(c *gin.Context) {
|
|
|
|
return func(c *gin.Context) {
|
|
|
|
switch c.Request.Method {
|
|
|
|
if c.Request.Method != http.MethodPost {
|
|
|
|
case http.MethodPost:
|
|
|
|
c.Next()
|
|
|
|
token := c.Request.Header.Get(constant.Token)
|
|
|
|
return
|
|
|
|
if token == "" {
|
|
|
|
}
|
|
|
|
log.ZWarn(c, "header get token error", errs.ErrArgs.Wrap("header must have token"))
|
|
|
|
|
|
|
|
apiresp.GinError(c, errs.ErrArgs.Wrap("header must have token"))
|
|
|
|
token := c.Request.Header.Get(constant.Token)
|
|
|
|
c.Abort()
|
|
|
|
if token == "" {
|
|
|
|
return
|
|
|
|
handleGinError(c, "header get token error", errs.ErrArgs, "header must have token")
|
|
|
|
}
|
|
|
|
return
|
|
|
|
claims, err := tokenverify.GetClaimFromToken(token, authverify.Secret())
|
|
|
|
}
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
log.ZWarn(c, "jwt get token error", errs.ErrTokenUnknown.Wrap())
|
|
|
|
claims, err := tokenverify.GetClaimFromToken(token, authverify.Secret())
|
|
|
|
apiresp.GinError(c, errs.ErrTokenUnknown.Wrap())
|
|
|
|
if err != nil {
|
|
|
|
c.Abort()
|
|
|
|
handleGinError(c, "jwt get token error", errs.ErrTokenUnknown, "")
|
|
|
|
return
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
m, err := dataBase.GetTokensWithoutError(c, claims.UserID, claims.PlatformID)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
m, err := dataBase.GetTokensWithoutError(c, claims.UserID, claims.PlatformID)
|
|
|
|
log.ZWarn(c, "cache get token error", errs.ErrTokenNotExist.Wrap())
|
|
|
|
if err != nil || len(m) == 0 {
|
|
|
|
apiresp.GinError(c, errs.ErrTokenNotExist.Wrap())
|
|
|
|
handleGinError(c, "cache get token error", errs.ErrTokenNotExist, "")
|
|
|
|
c.Abort()
|
|
|
|
return
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(m) == 0 {
|
|
|
|
if v, ok := m[token]; ok {
|
|
|
|
log.ZWarn(c, "cache do not exist token error", errs.ErrTokenNotExist.Wrap())
|
|
|
|
if v == constant.KickedToken {
|
|
|
|
apiresp.GinError(c, errs.ErrTokenNotExist.Wrap())
|
|
|
|
handleGinError(c, "cache kicked token error", errs.ErrTokenKicked, "")
|
|
|
|
c.Abort()
|
|
|
|
|
|
|
|
return
|
|
|
|
return
|
|
|
|
}
|
|
|
|
} else if v != constant.NormalToken {
|
|
|
|
if v, ok := m[token]; ok {
|
|
|
|
handleGinError(c, "cache unknown token error", errs.ErrTokenUnknown, "")
|
|
|
|
switch v {
|
|
|
|
|
|
|
|
case constant.NormalToken:
|
|
|
|
|
|
|
|
case constant.KickedToken:
|
|
|
|
|
|
|
|
log.ZWarn(c, "cache kicked token error", errs.ErrTokenKicked.Wrap())
|
|
|
|
|
|
|
|
apiresp.GinError(c, errs.ErrTokenKicked.Wrap())
|
|
|
|
|
|
|
|
c.Abort()
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
|
|
log.ZWarn(c, "cache unknown token error", errs.ErrTokenUnknown.Wrap())
|
|
|
|
|
|
|
|
apiresp.GinError(c, errs.ErrTokenUnknown.Wrap())
|
|
|
|
|
|
|
|
c.Abort()
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
apiresp.GinError(c, errs.ErrTokenNotExist.Wrap())
|
|
|
|
|
|
|
|
c.Abort()
|
|
|
|
|
|
|
|
return
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
c.Set(constant.OpUserPlatform, constant.PlatformIDToName(claims.PlatformID))
|
|
|
|
} else {
|
|
|
|
c.Set(constant.OpUserID, claims.UserID)
|
|
|
|
handleGinError(c, "token does not exist error", errs.ErrTokenNotExist, "")
|
|
|
|
c.Next()
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
c.Set(constant.OpUserPlatform, constant.PlatformIDToName(claims.PlatformID))
|
|
|
|
|
|
|
|
c.Set(constant.OpUserID, claims.UserID)
|
|
|
|
|
|
|
|
c.Next()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// handleGinError logs and returns an error response through Gin context.
|
|
|
|
|
|
|
|
func handleGinError(c *gin.Context, logMessage string, errType errs.CodeError, detail string) {
|
|
|
|
|
|
|
|
wrappedErr := errType.Wrap(detail)
|
|
|
|
|
|
|
|
log.ZInfo(c, logMessage, wrappedErr)
|
|
|
|
|
|
|
|
apiresp.GinError(c, wrappedErr)
|
|
|
|
|
|
|
|
c.Abort()
|
|
|
|
|
|
|
|
}
|
|
|
|