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(), }) } }