HashLoad / horse

Fast, opinionated, minimalist web framework for Delphi
MIT License
1.17k stars 217 forks source link

EHorseCallbackInterrupted retornando 404. #376

Closed MaxNstk closed 10 months ago

MaxNstk commented 10 months ago

Bom dia, estou criando um CallBack personalizado para validar alguns tipos de API que precisam que o usuário seja Administrador. Para isso estou utilizando o JWT Token em conjunto com os Claims para captura do token e recuperação de usuário. Tudo funciona perfeitamente, entretanto, ao criar a excessão EHorseCallbackInterrupted passando minha mensagem, ele retorna um 404 Not found no retorno da API. Ps, tenho outros callbacks que funcionam perfeitamente. (Com propósitos diferentes). O código a seguir é a implementação do meu CallBack. A lógica dentro dele funciona perfeitamente. Em seguida o código do callback do jwt, do qual usei como base para minha suposição.

function SupervisorRequest: THorseCallback; begin Result := procedure(Req: THorseRequest; Res: THorseResponse; Next: {$IF DEFINED(FPC)}TNextProc{$ELSE}TProc{$ENDIF}) begin try if not TUsuarioController.CriarComCodigoOuNome( Req.Session.IdUsuario ).GetUsuario.Supervisor then begin Res.Send('Não autorizado, é necessário um usuário supervisor').Status(THTTPStatus.Unauthorized); raise EHorseCallbackInterrupted.Create('Unauthorized'); end else Next; except on E: EHorseCallbackInterrupted do raise; on E: Exception do begin TLog.Log('Exception em SupervisorRequest: '+E.Message, Req); raise EHorseCallbackInterrupted.Create('Unauthorized'); end; end; end; end;

Dentro do Middleware, Horse.JTW ele tem o seguinte retorno em diversos locais, entretanto, a resposta deles é 401 e com a mensagem criada: except on E: EHorseCallbackInterrupted do raise; on E: Exception do begin AHorseResponse.Send('Invalid token authorization. ' + E.Message).Status(THTTPStatus.Unauthorized); raise EHorseCallbackInterrupted.Create; end; end;

Ps. Delphi 10.4 stock_app_ws: ├── horse-logger@2.0.7 │ ├── horse-utils-clientip@0.0.8 │ │ └── horse@3.1.5 │ └── horse@3.1.5 ├── jhonson@1.1.8 │ └── horse@3.1.5 ├── handle-exception@0.1.9 │ ├── horse@3.1.5 │ └── jhonson@1.1.8 │ └── horse@3.1.5 ├── horse@3.1.5 ├── horse-compression@1.1.11 │ └── horse@3.1.5 └── horse-jwt@2.0.14 ├── horse@3.1.5 ├── delphi-jose-jwt@v3.3.0 └── hashlib4pascal@1.0.0

MaxNstk commented 10 months ago

Descobri, o meu problema era a sequencia em que os Middlewares eram vinculados. HandleException deveria vir antes do meu middleware.

viniciussanchez commented 9 months ago

@MaxNstk desculpa a demora... e obrigado por dar o feedback de como resolveu... pode ajudar outros que tiverem problema com isso... vlw