package logic import ( "errors" "framework_v2/consts" "framework_v2/internal/providers" "framework_v2/internal/providers/jwks" "framework_v2/types" "github.com/gin-gonic/gin" "github.com/mitchellh/mapstructure" "go.uber.org/zap" "strings" ) type AuthLogic struct { } const AnonymousUser = "anonymous" var ( ErrNotValidToken = errors.New("无效的 JWT 令牌。") ErrJWTFormatError = errors.New("JWT 格式错误。") ErrNotBearerType = errors.New("不是 Bearer 类型。") ErrEmptyResponse = errors.New("我们的服务器返回了空请求,可能某些环节出了问题。") config = *providers.MustGet[providers.GlobalConfig]() logger = *providers.MustGet[zap.Logger]() ) func NewAuthLogic() *AuthLogic { return &AuthLogic{} } func (a *AuthLogic) GinMiddlewareAuth(c *gin.Context) (*types.User, error) { var sub = AnonymousUser var jwtIdToken = &types.User{} if config.DebugMode.Enable { jwtIdToken.Token.Sub = sub jwtIdToken.Valid = true return jwtIdToken, nil } else { authorization := c.Request.Header.Get(consts.AuthHeader) if authorization == "" { return nil, ErrJWTFormatError } authSplit := strings.Split(authorization, " ") if len(authSplit) != 2 { return nil, ErrJWTFormatError } if authSplit[0] != consts.AuthPrefix { return nil, ErrNotBearerType } token, err := jwks.ParseJWT(authSplit[1]) if err != nil { return nil, ErrJWTFormatError } sub, err = token.Claims.GetSubject() if err != nil { return nil, ErrNotValidToken } err = mapstructure.Decode(token.Claims, &jwtIdToken.Token) if err != nil { logger.Error("Failed to map token claims to JwtIDToken struct.\nError: " + err.Error()) return nil, nil } } return jwtIdToken, nil } func (a *AuthLogic) GinUser(c *gin.Context) *types.User { user, _ := c.Get(consts.AuthMiddlewareKey) return user.(*types.User) }