Files
exchange_go/common/middleware/auth.go
2025-02-06 11:14:33 +08:00

105 lines
2.7 KiB
Go

package middleware
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/go-admin-team/go-admin-core/sdk/pkg"
"go-admin/common/middleware/dto"
"go-admin/common/service/sysservice/sysstatuscode"
statuscode "go-admin/common/status_code"
"go-admin/pkg/cryptohelper/jwthelper"
"strconv"
"strings"
"time"
"github.com/go-admin-team/go-admin-core/sdk/config"
jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth"
"go-admin/common/middleware/handler"
)
// AuthInit jwt验证new
func AuthInit() (*jwt.GinJWTMiddleware, error) {
timeout := time.Hour
if config.ApplicationConfig.Mode == "dev" {
timeout = time.Duration(876010) * time.Hour
} else {
if config.JwtConfig.Timeout != 0 {
timeout = time.Duration(config.JwtConfig.Timeout) * time.Second
}
}
return jwt.New(&jwt.GinJWTMiddleware{
Realm: "test zone",
Key: []byte(config.JwtConfig.Secret),
Timeout: timeout,
MaxRefresh: time.Hour,
PayloadFunc: handler.PayloadFunc,
IdentityHandler: handler.IdentityHandler,
Authenticator: handler.Authenticator,
Authorizator: handler.Authorizator,
Unauthorized: handler.Unauthorized,
TokenLookup: "header: Authorization, query: token, cookie: jwt",
TokenHeadName: "Bearer",
TimeFunc: time.Now,
})
}
func FrontedAuth(c *gin.Context) {
// 从请求头中获取 token 和 os
token := c.GetHeader("Authorization")
source, _ := strconv.Atoi(c.GetHeader("os"))
// 如果 token 不存在,返回未登录的状态
if len(token) == 0 {
err := ResponseWithStatus(c, dto.NotLoginStatus, statuscode.NotLoggedIn)
if err != nil {
return
}
c.Abort() // 停止后续中间件的执行
return
}
// 验证 token 并获取结果
flag, rew := jwthelper.MidValidToken(token, source)
if flag < 0 || len(rew) == 0 {
if flag == -1 {
ResponseWithStatus(c, dto.NotLoginStatus, statuscode.NotLoggedIn)
} else if flag == -2 {
ResponseWithStatus(c, dto.ReLoginStatus, statuscode.ReLogin)
}
c.Abort() // 停止后续中间件的执行
return
}
// 将解析后的 token 设置到请求头中
c.Request.Header.Set("ParseToken", rew)
// 继续处理请求
c.Next()
}
// ResponseWithStatus 带状态的响应
func ResponseWithStatus(ctx *gin.Context, status int, code int, data ...interface{}) error {
// 获取语言对应的 msg
msg := sysstatuscode.GetStatusCodeDescription(ctx, code)
if msg == `` {
msg = strconv.Itoa(code)
} else {
// 配置了语言包参数
if strings.Contains(msg, "%") && len(data) > 1 {
msg = fmt.Sprintf(msg, data[1:]...)
}
}
resp := dto.Response{
Status: status,
Code: code,
Msg: msg,
}
resp.RequestID = pkg.GenerateMsgIDFromContext(ctx)
if len(data) > 0 {
resp.Data = data[0]
}
ctx.JSON(200, resp)
return nil
}