Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
132 lines
3.2 KiB
Go
132 lines
3.2 KiB
Go
package auth
|
|
|
|
import (
|
|
"net/http"
|
|
"strings"
|
|
"videoweb/app/appg"
|
|
"videoweb/pub/common/enum/consts"
|
|
"videoweb/pub/common/log"
|
|
"videoweb/pub/common/srvdef"
|
|
"videoweb/pub/common/utils"
|
|
"videoweb/pub/pubdef"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// gin 验证中间件
|
|
|
|
var (
|
|
// 白名单,不需要验证token的api
|
|
whiteList = []string{
|
|
"/swagger",
|
|
"/api/app/auth/guest",
|
|
"/api/app/auth/register",
|
|
"/api/app/auth/login",
|
|
"/api/app/auth/resetPassword",
|
|
"/api/app/video/list",
|
|
"/api/app/video/detail",
|
|
"/api/app/playlet/home",
|
|
"/api/app/playlet/recommend/list",
|
|
"/api/app/playlet/list",
|
|
"/api/app/playlet/operate/list",
|
|
"/api/app/playlet/rank",
|
|
"/api/app/playlet/today-update",
|
|
"/api/app/playlet/tag/list",
|
|
"/api/app/playlet/search",
|
|
"/api/app/playlet/hot-like",
|
|
"/api/app/playlet/detail",
|
|
"/api/app/playlet/chapter/detail",
|
|
"/api/app/recharge/package/list",
|
|
"/api/app/comment/list",
|
|
"/api/app/theme/list",
|
|
"/api/app/config/info",
|
|
"/api/app/config/footer/info",
|
|
"/api/app/config/richtext/list",
|
|
"/api/app/applist",
|
|
"/api/app/translation/category/list",
|
|
"/api/app/health/ping",
|
|
"/api/app/statcenter/sync",
|
|
"/h5/m3u8",
|
|
"/enkey",
|
|
"/newenkey",
|
|
}
|
|
)
|
|
|
|
var (
|
|
tokener = utils.NewTokenRedis()
|
|
)
|
|
|
|
func Auth(ctx *gin.Context) {
|
|
dotoken := func() srvdef.CodeType {
|
|
token := ctx.Request.Header.Get("Authorization")
|
|
// 去掉Bearer,如果有
|
|
token = utils.StripBearerPrefixFromTokenString(token)
|
|
|
|
if token == "" {
|
|
for _, w := range whiteList {
|
|
if strings.Contains(ctx.Request.URL.Path, w) {
|
|
return srvdef.Success
|
|
}
|
|
}
|
|
|
|
log.Error("Auth:token is empty", log.Any("sysType", ctx.GetString(consts.CtxSysType)))
|
|
return srvdef.InvalidToken
|
|
}
|
|
|
|
userId, newToken, err := utils.ParseUserToken(token, appg.Conf.JwtKey)
|
|
if err != nil {
|
|
for _, w := range whiteList {
|
|
if strings.Contains(ctx.Request.URL.Path, w) {
|
|
return srvdef.Success
|
|
}
|
|
}
|
|
|
|
log.Error("Auth:ParseUserToken", log.Any("token", token), log.E(err))
|
|
return srvdef.InvalidToken
|
|
}
|
|
|
|
if pubdef.IsCrawlerUser(userId) {
|
|
if len(newToken) > 0 {
|
|
ctx.Writer.Header().Set("Refresh-Authorization", newToken)
|
|
}
|
|
ctx.Set(consts.CtxUserID, userId)
|
|
ctx.Set(consts.CtxToken, token)
|
|
return srvdef.Success
|
|
}
|
|
|
|
has, err := tokener.Exists(userId, token)
|
|
if err != nil {
|
|
log.Error("Auth:Exists", log.Any("userId", userId), log.Any("token", token), log.E(err))
|
|
return srvdef.InvalidToken
|
|
}
|
|
if !has {
|
|
log.Error("Auth:Exists:token not exists", log.Any("userId", userId), log.Any("token", token), log.E(err))
|
|
return srvdef.InvalidToken
|
|
}
|
|
|
|
if len(newToken) > 0 {
|
|
err = tokener.Save(userId, newToken)
|
|
if err != nil {
|
|
log.Error("Auth:Save", log.Any("userId", userId), log.Any("token", newToken), log.E(err))
|
|
return srvdef.StoreLevel
|
|
}
|
|
ctx.Writer.Header().Set("Refresh-Authorization", newToken)
|
|
}
|
|
|
|
ctx.Set(consts.CtxUserID, userId)
|
|
ctx.Set(consts.CtxToken, token)
|
|
|
|
return srvdef.Success
|
|
}
|
|
|
|
errType := dotoken()
|
|
if errType != srvdef.Success {
|
|
// log.Info("Auth bad request", log.Any("Path", ctx.Request.URL.Path), log.Any("ip", ctx.ClientIP()))
|
|
ctx.AbortWithStatusJSON(http.StatusOK, gin.H{
|
|
"code": errType,
|
|
"msg": errType.Msg(),
|
|
})
|
|
}
|
|
|
|
}
|