54 lines
1.5 KiB
Go
54 lines
1.5 KiB
Go
package middleware
|
||
|
||
import (
|
||
"github.com/exhibition-main/internal/model"
|
||
"github.com/exhibition-main/internal/msg"
|
||
"github.com/exhibition-main/internal/response"
|
||
"github.com/exhibition-main/pkg/jwt"
|
||
"github.com/gin-gonic/gin"
|
||
|
||
"strings"
|
||
)
|
||
|
||
// JWTAuthMiddleware 基于JWT的认证中间件
|
||
func JWTAuthMiddleware() func(c *gin.Context) {
|
||
return func(c *gin.Context) {
|
||
authHeader := c.Request.Header.Get("Authorization")
|
||
if authHeader == "" {
|
||
response.ResponseQuickMsg(c, msg.Fail, msg.NEED_LOGIN, nil)
|
||
c.Abort()
|
||
return
|
||
}
|
||
// 按空格分割
|
||
parts := strings.SplitN(authHeader, " ", 2)
|
||
if !(len(parts) == 2 && parts[0] == "Bearer") {
|
||
response.ResponseMsg(c, msg.StatusUnauthorized, model.Response{
|
||
Status: msg.Fail,
|
||
Data: nil,
|
||
Msg: msg.NEED_LOGIN,
|
||
})
|
||
c.Abort()
|
||
return
|
||
}
|
||
// parts[1]是获取到的tokenString,我们使用之前定义好的解析JWT的函数来解析它
|
||
jwtInfo, err := jwt.ParseToken(parts[1])
|
||
if err != nil {
|
||
response.ResponseMsg(c, msg.StatusUnauthorized, model.Response{
|
||
Status: msg.Fail,
|
||
Data: nil,
|
||
Msg: msg.INVALID_TOKEN,
|
||
})
|
||
c.Abort()
|
||
return
|
||
}
|
||
// 将当前请求的userID信息保存到请求的上下文c上
|
||
c.Set(model.CTX_USER_INFO, jwt.MyClaims{
|
||
UserId: jwtInfo.UserId,
|
||
Nickname: jwtInfo.Nickname,
|
||
Phone: jwtInfo.Phone,
|
||
Openid: jwtInfo.Openid,
|
||
})
|
||
c.Next() // 后续的处理请求的函数中 可以用过c.Get(CtxUserIDKey) 来获取当前请求的用户信息
|
||
}
|
||
}
|