package basic import ( "errors" "fusenapi/utils/auth" "net/http" "reflect" "github.com/golang-jwt/jwt" "github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/rest/httpx" ) type IJWTParse interface { ParseJwtToken(r *http.Request) (jwt.MapClaims, error) } func BeforeLogic(w http.ResponseWriter, r *http.Request, l reflect.Value) (isNext bool) { m := l.MethodByName("BeforeLogic") if m.IsValid() { result := m.Call([]reflect.Value{reflect.ValueOf(w), reflect.ValueOf(r)}) if len(result) != 0 { return false } } return true } func AfterLogic(w http.ResponseWriter, r *http.Request, l reflect.Value, resp *Response) bool { m := l.MethodByName("AfterLogic") if m.IsValid() { m.Call([]reflect.Value{reflect.ValueOf(w), reflect.ValueOf(r), reflect.ValueOf(resp)}) return true } return false } func NormalAfterLogic(w http.ResponseWriter, r *http.Request, resp *Response) { // 如果响应不为nil,则使用httpx.OkJsonCtx方法返回JSON响应; if resp != nil { httpx.OkJsonCtx(r.Context(), w, resp) } else { err := errors.New("server logic is error, resp must not be nil") httpx.ErrorCtx(r.Context(), w, err) logx.Error(err) } } func RequestParse(w http.ResponseWriter, r *http.Request, svcCtx IJWTParse, LogicRequest any) (userinfo *auth.UserInfo, err error) { // 解析JWT token,并对空用户进行判断 claims, err := svcCtx.ParseJwtToken(r) // 如果解析JWT token出错,则返回未授权的JSON响应并记录错误消息 if err != nil { httpx.OkJsonCtx(r.Context(), w, &Response{ Code: 401, // 返回401状态码,表示未授权 Message: "unauthorized", // 返回未授权信息 }) logx.Info("unauthorized:", err.Error()) // 记录错误日志 return } if claims != nil { // 从token中获取对应的用户信息 userinfo, err = auth.GetUserInfoFormMapClaims(claims) // 如果获取用户信息出错,则返回未授权的JSON响应并记录错误消息 if err != nil { httpx.OkJsonCtx(r.Context(), w, &Response{ Code: 401, Message: "unauthorized", }) logx.Info("unauthorized:", err.Error()) return } } else { // 如果claims为nil,则认为用户身份为白板用户 userinfo = &auth.UserInfo{UserId: 0, GuestId: 0} } // var req types.RequestGoogleLogin // 如果端点有请求结构体,则使用httpx.Parse方法从HTTP请求体中解析请求数据 if err = httpx.Parse(r, LogicRequest); err != nil { httpx.OkJsonCtx(r.Context(), w, &Response{ Code: 510, Message: "parameter error", }) logx.Info(err) return } return userinfo, err } func RequestParseBackend(w http.ResponseWriter, r *http.Request, svcCtx IJWTParse, LogicRequest any) (userinfo *auth.BackendUserInfo, err error) { // 解析JWT token,并对空用户进行判断 claims, err := svcCtx.ParseJwtToken(r) // 如果解析JWT token出错,则返回未授权的JSON响应并记录错误消息 if err != nil { httpx.OkJsonCtx(r.Context(), w, &Response{ Code: 401, // 返回401状态码,表示未授权 Message: "unauthorized", // 返回未授权信息 }) logx.Info("unauthorized:", err.Error()) // 记录错误日志 return } if claims != nil { // 从token中获取对应的用户信息 userinfo, err = auth.GetBackendUserInfoFormMapClaims(claims) // 如果获取用户信息出错,则返回未授权的JSON响应并记录错误消息 if err != nil { httpx.OkJsonCtx(r.Context(), w, &Response{ Code: 401, Message: "unauthorized", }) logx.Info("unauthorized:", err.Error()) return } } // var req types.RequestGoogleLogin // 如果端点有请求结构体,则使用httpx.Parse方法从HTTP请求体中解析请求数据 if err = httpx.Parse(r, LogicRequest); err != nil { httpx.OkJsonCtx(r.Context(), w, &Response{ Code: 510, Message: "parameter error", }) logx.Info(err) return } return userinfo, err }