Transmissão de DPS via navegador do usuário: é possível? (Problema de CORS e pré-flight OPTIONS 405)

Olá!

Estou desenvolvendo uma aplicação web e gostaria de esclarecer uma dúvida sobre a transmissão da DPS utilizando o certificado digital do próprio usuário. A ideia é evitar que o usuário envie o certificado e a senha ao meu backend, permitindo que todo o processo ocorra diretamente no navegador, mantendo o controle do certificado exclusivamente com o usuário.

No entanto, ao tentar realizar a transmissão através do browser, estou enfrentando um problema relacionado ao CORS. Durante uma requisição POST, o pré-flight (OPTIONS) retorna 405 – Method Not Allowed, o que, em seguida, ocasiona também o erro de CORS na requisição principal.

Minhas dúvidas são:

  1. É suportado transmitir a DPS diretamente do navegador do usuário, mesmo que ele esteja acessando a aplicação a partir do meu domínio?

  2. Caso esse cenário não esteja previsto, seria possível configurar o backend de produção restrita e o de produção para aceitar requisições vindas de outro domínio, permitindo esse fluxo via browser?

Agradeço desde já qualquer orientação ou esclarecimento que possam fornecer!

Olá Ademar,

Muitos erros de CORS ocorrem pelo próprio paginador, sendo padrão o comportamento, vide documentação no mozila.org.

Para alterar o comportamento, teria de ser incluida a política na aplicação do Servidor Web para carregar e alterar as políticas, o que vejo inviável acontecer nos servidores do Serpro.

A rejeições ocorridas visam ao aumento da segunrança para os usuários, frente a quantidade de ataques que ocorrem com frequência.

Entrar em um domínio e redirecionar para outro, seria a característica de gerar CORS, para isto existe as restrições.

Tente outra abordagem, mas não vemos como alterar políticas no Servidor Web do Serpro para tal situação, além de restrições que ocorreram antes mesmo de enviar.

O fórum por mais que ajude nas dúvidas sobre o Sistema Nacional. Somos todos colaboradores e estamos com carga de trabalho acentuada cuidando de nossas atividades profissíonais, no fórum, GT NFSe etc.

Por mais boa vontade, não vejo este assunto ter suporte neste fórum.

At.te,

Emir Toktar

Obrigado pela atenção, Emir.

Compreendo perfeitamente que essas restrições existem por motivos de segurança. Minha sugestão foi no sentido de avaliar a possibilidade de permitir, eventualmente, a inclusão de domínios específicos nas origens autorizadas, caso haja aplicações web que precisem realizar esse tipo de integração diretamente do navegador. Isso ajudaria a manter uma solução mais simples para o usuário, sem necessidade de instalar plugins ou aplicações adicionais, e também evitaria que o certificado e a senha precisassem ser enviados ao meu backend.

Acreditei inicialmente que essa abordagem poderia ser viável porque requisições simples GET ao sistema ADN funcionam normalmente no Chrome (conforme exemplo no jsfiddle abaixo). Nesses casos, o navegador solicita ao usuário o certificado já instalado localmente e completa a requisição sem problemas. Presumo que isso ocorra porque, para esse cenário, não há um pré-flight OPTIONS.

Pelos testes que realizei (inclusive via Postman), notei que os endpoints de produção restrita, tanto do ADN quanto da SEFIN, não respondem a requisições com método OPTIONS, e isso faz com que o navegador bloqueie a requisição principal POST antes mesmo de enviá-la. Nesse sentido, o problema inicial não seria estritamente de CORS, mas sim da ausência de suporte ao método OPTIONS, que acaba sendo necessário para requisições complexas feitas via browser.

Preparei dois exemplos para ilustrar o comportamento, um GET, que funciona corretamente, e um POST, que falha devido ao pré-flight.

Basta o usuário ter o certificado instalado no próprio chrome:

De todo modo, deixo registrada como sugestão a possibilidade de uma futura implementação que permita esse tipo de fluxo. Enquanto isso, continuarei avaliando outras alternativas para viabilizar a integração.

Agradeço novamente pela atenção.