|
@@ -2,15 +2,19 @@ package middleware
|
|
|
|
|
|
import (
|
|
|
"fmt"
|
|
|
- "github.com/gin-gonic/gin"
|
|
|
- "go.uber.org/zap"
|
|
|
"sfbase/global"
|
|
|
+ "sfbase/redis"
|
|
|
sutils "sfbase/utils"
|
|
|
+ "sfis/db"
|
|
|
+ "sfis/model"
|
|
|
"sfis/model/response"
|
|
|
"sfis/utils"
|
|
|
"strconv"
|
|
|
"strings"
|
|
|
"time"
|
|
|
+
|
|
|
+ "github.com/gin-gonic/gin"
|
|
|
+ "go.uber.org/zap"
|
|
|
)
|
|
|
|
|
|
const TimestampExpireTime = 600 //单位秒,header里的时间戳超时时间 10分钟
|
|
@@ -26,17 +30,19 @@ func TokenAuth() gin.HandlerFunc {
|
|
|
requestIP string
|
|
|
)
|
|
|
requestUrl = context.Request.URL.String()
|
|
|
- requestUrl = strings.Split(requestUrl, "?")[0]
|
|
|
- a := strings.Split(requestUrl, "/")
|
|
|
- requestUrl = a[4]
|
|
|
- /*if p, ok := utils.ApiUrlCache.Load(requestUrl); ok {
|
|
|
- productID = p.(*model.Product).ID
|
|
|
+ global.Logger.Info(requestUrl)
|
|
|
+ requestUrl = strings.Split(requestUrl, "v1")[1]
|
|
|
+ global.Logger.Info(requestUrl)
|
|
|
+ // a := strings.Split(requestUrl, "/")
|
|
|
+ // requestUrl = a[4]
|
|
|
+ if p, ok := utils.ApiUrlCache.Load(requestUrl); ok {
|
|
|
+ productID = p.(int)
|
|
|
} else {
|
|
|
response.FailWithDetailed(response.ParamError, nil, "url错误", context)
|
|
|
context.Abort()
|
|
|
return
|
|
|
- }*/
|
|
|
- productID = 1000
|
|
|
+ }
|
|
|
+ // productID = 1000
|
|
|
token = context.Request.Header.Get("token")
|
|
|
timestamp = context.Request.Header.Get("timestamp")
|
|
|
appID = context.PostForm("app_id")
|
|
@@ -53,7 +59,11 @@ func TokenAuth() gin.HandlerFunc {
|
|
|
return
|
|
|
}
|
|
|
now := time.Now().Unix()
|
|
|
- if now-_timestamp > TimestampExpireTime {
|
|
|
+ TimestampExpire := now - _timestamp
|
|
|
+ if TimestampExpire < 0 {
|
|
|
+ TimestampExpire = -TimestampExpire
|
|
|
+ }
|
|
|
+ if TimestampExpire > TimestampExpireTime {
|
|
|
//token时间验证 十分钟
|
|
|
response.FailWithDetailed(response.TokenExpired, nil, "签名过期", context)
|
|
|
context.Abort()
|
|
@@ -68,8 +78,8 @@ func TokenAuth() gin.HandlerFunc {
|
|
|
/**
|
|
|
第一步:ip白名单校验
|
|
|
*/
|
|
|
+ requestIP = utils.GetIp(context.Request)
|
|
|
if ipWhiteList != "*" {
|
|
|
- requestIP = utils.GetIp(context.Request)
|
|
|
if strings.Index(ipWhiteList, requestIP) < 0 {
|
|
|
response.FailWithDetailed(response.IpInvalid, nil, "ip不在白名单", context)
|
|
|
context.Abort()
|
|
@@ -86,9 +96,30 @@ func TokenAuth() gin.HandlerFunc {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
+ userProduct := &model.UserProduct{}
|
|
|
+ db.GetSFISDB().First(userProduct, &model.UserProduct{AppID: appID, ProductID: productID})
|
|
|
+ //校验是否过期
|
|
|
+ end := userProduct.EndAt
|
|
|
+ if now > end.Unix() {
|
|
|
+ response.FailWithDetailed(response.InterfaceExpired, nil, "剩余量已过期", context)
|
|
|
+ context.Abort()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ //校验每日调用上限
|
|
|
+ limittodaykey := fmt.Sprintf("limittoday_%d_%d_%s", time.Now().Day(), productID, appID)
|
|
|
+ limittoday := redis.GetInt("limit", limittodaykey)
|
|
|
+ if limittoday >= userProduct.CallTimesLimitDay { //当天调用超过次数
|
|
|
+ response.FailWithDetailed(response.MoreThanEveryDayDataNumberLimit, nil, "请求超过每日调用总量限制", context)
|
|
|
+ context.Abort()
|
|
|
+ return
|
|
|
+ } else {
|
|
|
+ if limittoday == 0 {
|
|
|
+ _, max := sutils.GetDayMinMax(time.Now())
|
|
|
+ redis.Put("limit", limittodaykey, 0, int(max-now))
|
|
|
+ }
|
|
|
+ }
|
|
|
context.Set("appID", appID)
|
|
|
context.Set("productID", productID)
|
|
|
context.Set("requestIP", requestIP)
|
|
|
-
|
|
|
}
|
|
|
}
|