131 lines
3.1 KiB
Go
131 lines
3.1 KiB
Go
package middleware
|
||
|
||
import (
|
||
"strconv"
|
||
"time"
|
||
|
||
"github.com/gogf/gf/v2/net/ghttp"
|
||
"github.com/gogf/gf/v2/os/gctx"
|
||
"github.com/gogf/gf/v2/os/glog"
|
||
"github.com/gogf/gf/v2/text/gstr"
|
||
|
||
"kami/utility/config"
|
||
"kami/utility/token"
|
||
"kami/utility/verify"
|
||
)
|
||
|
||
func LoginAuth(r *ghttp.Request) {
|
||
// 获取Token
|
||
tokenStr := token.GetRequestToken(r)
|
||
if tokenStr == "" {
|
||
r.Response.WriteJson(token.AuthFailed{
|
||
Code: token.FailedAuthCode,
|
||
Message: "获取Token失败",
|
||
})
|
||
return
|
||
}
|
||
ctx := gctx.New()
|
||
userToken, err := token.ParseUserToken(ctx, tokenStr)
|
||
if err != nil {
|
||
glog.Error(ctx, "校验Token失败", err)
|
||
r.Response.WriteJson(token.AuthFailed{
|
||
Code: token.FailedAuthCode,
|
||
Message: "获取Token失败",
|
||
})
|
||
return
|
||
}
|
||
// 查看redis中是否有token
|
||
oldTokenStr, err := token.GetTokenFromRedis(ctx, userToken.UserID)
|
||
if err != nil {
|
||
glog.Error(ctx, "校验Token失败", err)
|
||
r.Response.WriteJson(token.AuthFailed{
|
||
Code: token.FailedAuthCode,
|
||
Message: "获取Token失败",
|
||
})
|
||
return
|
||
}
|
||
if oldTokenStr != tokenStr {
|
||
glog.Error(ctx, "校验Token失败", err)
|
||
r.Response.WriteJson(token.AuthFailed{
|
||
Code: token.FailedAuthCode,
|
||
Message: "当前Token失效",
|
||
})
|
||
return
|
||
}
|
||
// 续签token
|
||
newToken, err := token.RefreshUserToken(ctx, *userToken)
|
||
if err != nil {
|
||
glog.Error(ctx, "续签Token失败", err)
|
||
r.Response.WriteJson(token.AuthFailed{
|
||
Code: token.FailedAuthCode,
|
||
Message: "续签Token失败",
|
||
})
|
||
return
|
||
}
|
||
if newToken != "" {
|
||
r.Response.Header().Set("Authorization", "Bearer "+newToken)
|
||
}
|
||
r.Middleware.Next()
|
||
}
|
||
|
||
func IFrameAuth(r *ghttp.Request) {
|
||
|
||
blackList := []string{
|
||
"/api/cardInfo/appleCard/submit",
|
||
"/cardInfo/appleCard/submit",
|
||
"/api/cardInfo/appleCard/rechargeOrder/handler",
|
||
"/api/cardInfo/appleCard/query",
|
||
"/api/cardInfo/appleCard/rechargeOrder/callback",
|
||
}
|
||
if gstr.InArray(blackList, r.URL.Path) {
|
||
r.Middleware.Next()
|
||
return
|
||
}
|
||
|
||
tokenStr := token.GetRequestToken(r)
|
||
if tokenStr == "" {
|
||
r.Response.WriteJson(token.AuthFailed{
|
||
Code: token.FailedAuthCode,
|
||
Message: "Token不存在,请刷新页面!",
|
||
})
|
||
return
|
||
}
|
||
ctx := r.GetCtx()
|
||
cfg := config.NewConfig(ctx)
|
||
frontendModel, err := cfg.GetFrontendSecret()
|
||
if err != nil {
|
||
r.Response.WriteJson(token.AuthFailed{
|
||
Code: token.FailedAuthCode,
|
||
Message: "解析Token错误!",
|
||
})
|
||
return
|
||
}
|
||
tokenByte, err := verify.AesCBCURLDecryptWithBase64(tokenStr, []byte(frontendModel.Key), []byte(frontendModel.IV))
|
||
if err != nil {
|
||
glog.Error(ctx, "解析Token错误", tokenStr, err)
|
||
r.Response.WriteJson(token.AuthFailed{
|
||
Code: token.FailedAuthCode,
|
||
Message: "Token格式错误!",
|
||
})
|
||
return
|
||
}
|
||
//字符串转数字
|
||
timestamp, err := strconv.ParseInt(string(tokenByte), 10, 64)
|
||
if err != nil {
|
||
glog.Error(ctx, "解析Token错误", tokenStr, err)
|
||
r.Response.WriteJson(token.AuthFailed{
|
||
Code: token.FailedAuthCode,
|
||
Message: "Token格式错误!",
|
||
})
|
||
return
|
||
}
|
||
if time.Since(time.Unix(timestamp, 0)) > time.Minute*30 {
|
||
r.Response.WriteJson(token.AuthFailed{
|
||
Code: token.FailedAuthCode,
|
||
Message: "token失效,请刷新页面!",
|
||
})
|
||
return
|
||
}
|
||
r.Middleware.Next()
|
||
}
|