80 lines
1.8 KiB
Go
80 lines
1.8 KiB
Go
package http_gateway
|
||
|
||
import (
|
||
"fmt"
|
||
"git.hlsq.asia/mmorpg/service-common/net/http/http_resp"
|
||
"git.hlsq.asia/mmorpg/service-common/utils"
|
||
"git.hlsq.asia/mmorpg/service-gateway/config"
|
||
"github.com/gin-contrib/cors"
|
||
"github.com/gin-gonic/gin"
|
||
"go.uber.org/zap"
|
||
"strings"
|
||
"time"
|
||
)
|
||
|
||
func corsConfig() cors.Config {
|
||
return cors.Config{
|
||
AllowMethods: []string{"GET", "POST", "OPTIONS"},
|
||
AllowHeaders: []string{"Content-Type", "Authorization"},
|
||
AllowCredentials: false,
|
||
AllowAllOrigins: true,
|
||
MaxAge: 12 * time.Hour,
|
||
}
|
||
}
|
||
|
||
func ginLogger(logger *zap.SugaredLogger) gin.HandlerFunc {
|
||
return func(c *gin.Context) {
|
||
start := time.Now()
|
||
path := c.Request.URL.Path
|
||
c.Next()
|
||
cost := time.Since(start)
|
||
usn, _ := c.Get("usn")
|
||
|
||
logger.Infof(fmt.Sprintf(
|
||
"[usn:%v] Method:%v Code:%v Time:%v IP:%v Path:%v",
|
||
usn,
|
||
c.Request.Method,
|
||
c.Writer.Status(),
|
||
cost,
|
||
c.ClientIP(),
|
||
path),
|
||
)
|
||
}
|
||
}
|
||
|
||
func authJwt() gin.HandlerFunc {
|
||
return func(c *gin.Context) {
|
||
pList := strings.SplitN(c.Request.URL.Path, "/", 4)
|
||
if len(pList) < 4 || pList[2] == "" {
|
||
http_resp.JsonNotFound(c)
|
||
c.Abort()
|
||
return
|
||
}
|
||
// 如果是Public接口,有Token就读,没有就算了
|
||
public := pList[2] == "open"
|
||
|
||
token := strings.TrimPrefix(c.GetHeader("Authorization"), "Bearer ")
|
||
if token == "" {
|
||
if public {
|
||
c.Next()
|
||
return
|
||
}
|
||
http_resp.JsonUnauthorized(c)
|
||
c.Abort()
|
||
return
|
||
}
|
||
claims, err := utils.ParseToken(token, config.Get().Auth.Secret)
|
||
if err != nil {
|
||
http_resp.JsonUnauthorized(c)
|
||
c.Abort()
|
||
return
|
||
}
|
||
|
||
// 这里将Header写到请求中,grpc-gateway框架会读取然后传给grpc服务
|
||
c.Request.Header.Set("X-Usn", utils.Int64ToString(claims.USN))
|
||
// 这里写到上下文中,打日志
|
||
c.Set("usn", claims.USN)
|
||
c.Next()
|
||
}
|
||
}
|