Skip Route
Hello!
I had problems with SkipRoute in an API in NGINX Gateway using basic authentication, I modified in my projects for this code :
if MatchRoute(LPathInfo, Config.SkipRoutes) then begin ANext(); Exit; end;
to
var lroute : string; begin LPathInfo := AHorseRequest.RawWebRequest.PathInfo; if LPathInfo = EmptyStr then LPathInfo := '/'; for lroute in Config.SkipRoutes do begin if Pos(lroute, LPathInfo) > 0 then begin ANext(); Exit; end; end;
if MatchRoute(LPathInfo, Config.SkipRoutes) then
begin
ANext();
Exit;
end;
for LRoute in Config.SkipRoutes do
begin
if Pos(LRoute, LPathInfo) > 0 then
begin
ANext();
Exit;
end;
end;
O código apresentado como solução, faz com que seja criado uma outra falha no skiproutes. Supondo que temos um skiproutes '/users/:id' e temos duas rotas registradas no sistema, '/users' e '/users/:id'. Com o código sugerido, as duas ficam abertas. O mesmo ocorre se falarmos que o skiproutes é '/users', ambas ficam disponíveis sem autenticação.
Olá! No exemplo acima, ele só vai liberar o endpoint todo se for informado no SkipRoutes "/users", se for informado "/users/:id", ele só vai liberar a rota inteira se tiver algo após, ex: "/users/:id/list". Eu entendo desse efeito colateral, teria alguma sugestão pra resolver 100% o problema?
A princípio não tenho... na verdade, precisava ver qual é de fato o problema que esta tendo usando da forma atual. Você disse que tem um problema com o NGINX, mas qual seria o problema? Da algum erro? Talvez podemos pensar em como resolver isso de outra forma, sem alterar a função.
No NGINX, estou usando como um API Gateway, na hora que ele faz o roteamento, ele adiciona o roteamento completo na path, ai ele não dá o match e bloqueia todas as comunicações, por isso que eu mandei fazer a pesquisa na string para que ele "ignore" a parte inicial do roteamento injetado pelo NGINX. Uma questão poderia ser ele analisar o final do path ignorando a parte inicial que vem do redirecionamento do NGINX.
Certo... como você tem um ambiente de teste ai, vamos tentar fazer o seguinte. Eu lembro que nessa linha aqui:
LPathInfo := AHorseRequest.RawWebRequest.PathInfo;
Existe outras opções envolvendo o Path. Poderia testar as demais opções e ver se alguma delas trás o valor sem a parte inicial? Outra possível solução que vejo, seria dar um replace nesse LPathInfo, removendo o inicio do path. Por exemplo, supondo que você tenha um path full http://localhost:9000/users, então o replace removeria o http://localhost:9000.