142 lines
3.4 KiB
Go
142 lines
3.4 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"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// gin 验证中间件
|
|
|
|
var (
|
|
// 白名单,不需要验证token的api
|
|
whiteList = []string{
|
|
"/swagger",
|
|
"/api/app/ping/check",
|
|
"/api/app/ping/config",
|
|
"/api/app/health/ping",
|
|
"/api/app/login/guest",
|
|
"/api/app/auth/register",
|
|
"/api/app/auth/login",
|
|
"/api/app/user/qrcode/info",
|
|
"/api/app/upload/images",
|
|
"/api/app/home",
|
|
"/api/app/richtext",
|
|
"/api/app/content/tag/list",
|
|
"/api/app/config/footer/info",
|
|
"/api/app/config/richtext/list",
|
|
"/api/app/navigation/header",
|
|
"/api/app/comment/list",
|
|
"/api/app/video/more",
|
|
"/api/app/video/list",
|
|
"/api/app/video/category/list",
|
|
"/api/app/video/info",
|
|
"/api/app/video/recommend/list",
|
|
"/api/app/video/guess/list",
|
|
"/api/app/video/rank/list",
|
|
"/api/app/playlet/recommend/list",
|
|
"/api/app/playlet/guess/list",
|
|
"/api/app/playlet/home",
|
|
"/api/app/playlet/home-config/list",
|
|
"/api/app/playlet/topic/detail",
|
|
"/api/app/playlet/theme/list",
|
|
"/api/app/playlet/list",
|
|
"/api/app/playlet/content/list",
|
|
"/api/app/playlet/tag/",
|
|
"/api/app/playlet/info",
|
|
"/api/app/playlet/chapter/info",
|
|
"/api/app/playlet/rank/list",
|
|
"/api/app/actress",
|
|
"/api/app/upload/videoBody",
|
|
"/api/app/upload/videoOk",
|
|
"/api/app/upload/image",
|
|
"/search",
|
|
"/api/app/applist",
|
|
"/api/app/ads/click",
|
|
"/h5/m3u8",
|
|
"/enkey",
|
|
"/newenkey",
|
|
"/lsjenkey",
|
|
"/dh",
|
|
"/businessCooperation/",
|
|
"/servicesProject/",
|
|
"/consulting/",
|
|
"/consultinginfo/",
|
|
}
|
|
)
|
|
|
|
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
|
|
}
|
|
|
|
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(),
|
|
})
|
|
}
|
|
|
|
}
|