74 lines
1.9 KiB
Go
74 lines
1.9 KiB
Go
package middleware
|
||
|
||
import (
|
||
"encoding/json"
|
||
"log"
|
||
"net/http"
|
||
"time"
|
||
|
||
"git.apinb.com/bsm-sdk/core/crypto/encipher"
|
||
"git.apinb.com/bsm-sdk/core/errcode"
|
||
"git.apinb.com/bsm-sdk/core/types"
|
||
"github.com/gin-gonic/gin"
|
||
)
|
||
|
||
func JwtAuth(time_verify bool) gin.HandlerFunc {
|
||
return func(c *gin.Context) {
|
||
// 从请求头中获取 Authorization
|
||
authHeader := c.GetHeader("Authorization")
|
||
if authHeader == "" {
|
||
log.Printf("获取token异常:%v\n", "Authorization header is required")
|
||
c.JSON(http.StatusUnauthorized, gin.H{"error": "Authorization header is required"})
|
||
c.Abort()
|
||
return
|
||
}
|
||
// 提取Token
|
||
claims, err := encipher.ParseTokenAes(authHeader)
|
||
if err != nil || claims == nil {
|
||
log.Printf("提取token异常:%v\n", err)
|
||
c.JSON(http.StatusUnauthorized, gin.H{"error": "Token is required"})
|
||
c.Abort()
|
||
return
|
||
}
|
||
|
||
// 检测是否需要验证token时间
|
||
if time_verify {
|
||
// 判断时间claims.ExpiresAt
|
||
if time.Now().Unix() > claims.ExpiresAt {
|
||
log.Println("token过期,请重新获取:", "Token has expired")
|
||
c.JSON(http.StatusUnauthorized, gin.H{"error": "Token has expired"})
|
||
c.Abort()
|
||
return
|
||
}
|
||
}
|
||
|
||
// 将解析后的 Token 存储到上下文中
|
||
c.Set("Auth", claims)
|
||
// 如果 Token 有效,继续处理请求
|
||
c.Next()
|
||
}
|
||
}
|
||
|
||
// 获取上下文用户登录信息
|
||
func ParseAuth(c *gin.Context) (*types.JwtClaims, error) {
|
||
claims, ok := c.Get("Auth")
|
||
if !ok {
|
||
log.Printf("获取登录信息异常: %v", errcode.ErrJWTAuthNotFound)
|
||
return nil, errcode.ErrJWTAuthNotFound
|
||
}
|
||
|
||
json_claims, err := json.Marshal(claims)
|
||
if err != nil {
|
||
log.Printf("解析json异常: %v", err)
|
||
return nil, errcode.ErrJsonMarshal
|
||
}
|
||
|
||
var auth *types.JwtClaims
|
||
if err := json.Unmarshal(json_claims, &auth); err != nil {
|
||
log.Printf("解析json异常: %v", err)
|
||
return nil, errcode.ErrJsonUnmarshal
|
||
}
|
||
|
||
return auth, nil
|
||
}
|