Preciso enviar um pedido de autorização usando autenticação básica. Eu implementei isso com sucesso usando jquery. No entanto, quando recebo o erro 401, o pop-up do navegador de autenticação básica é aberto e o retorno de chamada de erro do jquery ajax não é chamado.
javascript
jquery
rest
basic-authentication
Alexey Zakharov
fonte
fonte
Respostas:
Eu também estava enfrentando esse problema recentemente. Como você não pode alterar o comportamento padrão do navegador de mostrar o pop-up no caso de uma
401
( autenticação básica ou digest ), existem duas maneiras de corrigir isso:401
. Em200
vez disso, retorne um código e trate-o em seu cliente jQuery.Altere o método que você está usando para autorização para um valor personalizado em seu cabeçalho. Os navegadores exibirão o pop-up para Basic e Digest . Você deve alterar isso no cliente e no servidor.
Por favor, também dê uma olhada este para um exemplo de como usar jQuery com Auth Basic.
fonte
<security:http-basic/>
você não precisa definir,basicAuthenticationFilter
mas deve defini-lo como<security:http-basic entry-point-ref="myBasicAuthenticationEntryPoint"/>
.401
eWWW-Authenticate:Bearer WWW-Authenticate:NTLM WWW-Authenticate:Negotiate
Você sabe por que seriaRetorne um código de status 400 genérico e, em seguida, processe esse lado do cliente.
Ou você pode manter o 401 e não retornar o cabeçalho WWW-Authenticate, que é realmente o que o navegador está respondendo com o pop-up de autenticação. Se o cabeçalho WWW-Authenticate estiver ausente, o navegador não solicitará as credenciais.
fonte
res.removeHeader('www-authenticate'); // prevents browser from popping up a basic auth window.
Você pode suprimir o pop-up de autenticação básico com url de solicitação semelhante a este:
Se você obtiver o erro 401 (nome de usuário ou senha incorretos), ele será tratado corretamente com o retorno de chamada de erro do jquery. Isso pode causar alguns problemas de segurança (no caso do protocolo http em vez de https), mas funciona.
UPD: o suporte desta solução será removido no Chrome 59
fonte
https://user:pass@host/
no M59 por volta de junho de 2017. Veja esta postagem do blog chromestatus para mais informações.Como outros apontaram, a única maneira de alterar o comportamento do navegador é garantir que a resposta não contenha um código de status 401 ou, se contiver, não inclua o
WWW-Authenticate: Basic
cabeçalho. Como alterar o código de status não é muito semântico e indesejável, uma boa abordagem é remover oWWW-Authenticate
cabeçalho. Se você não pode ou não deseja modificar seu aplicativo de servidor web, você sempre pode servir ou proxy através do Apache (se você ainda não estiver usando o Apache).Aqui está uma configuração para o Apache reescrever a resposta para remover o cabeçalho WWW-Authenticate IFF que a solicitação contém contém o cabeçalho
X-Requested-With: XMLHttpRequest
(que é definido por padrão pelas principais estruturas Javascript, como JQuery / AngularJS, etc ...) E a resposta contém o cabeçalhoWWW-Authenticate: Basic
.Testado em Apache 2.4 (não tenho certeza se funciona com 2.2). Isso depende do
mod_headers
módulo que está sendo instalado. (No Debian / Ubuntu,sudo a2enmod headers
e reinicie o Apache)fonte
proxy_hide_header WWW-Authenticate;
Use X-Requested-With: XMLHttpRequest com seu cabeçalho de solicitação. Portanto, o cabeçalho da resposta não conterá WWW-Authenticate: Basic.
fonte
Se estiver usando um servidor IIS, você pode configurar a regravação de URL do IIS (v2) para reescrever o
WWW-Authentication
cabeçalhoNone
no URL solicitado.Guia aqui .
O valor que você deseja alterar é
response_www_authenticate
.Se precisar de mais informações, adicione um comentário e postarei o arquivo web.config.
fonte
Se o cabeçalho WWW-Authenticate for removido, você não obterá o cache de credenciais e não receberá de volta o cabeçalho Authorization na solicitação. Isso significa que agora você terá que inserir as credenciais para cada nova solicitação gerada.
fonte
Como alternativa, se você pode personalizar a resposta do servidor, você pode retornar um 403 Forbidden.
O navegador não abrirá o pop-up de autenticação e o retorno de chamada do jquery será chamado.
fonte
No Safari, você pode usar solicitações síncronas para evitar que o navegador exiba o pop-up. Obviamente, as solicitações síncronas só devem ser usadas neste caso para verificar as credenciais do usuário ... Você pode usar essa solicitação antes de enviar a solicitação real, o que pode causar uma experiência ruim para o usuário se o conteúdo (enviado ou recebido) for muito pesado.
fonte
Faça um / login url, aceite os parâmetros "usuário" e "senha" via GET e não exija autenticação básica. Aqui, use php, node, java, qualquer coisa e analise seu arquivo passwd e combine os parâmetros (user / pass) com ele. Se houver uma correspondência, redirecione para http: // user: [email protected]/ (isso definirá a credencial em seu navegador); caso contrário, envie uma resposta 401 (sem o cabeçalho WWW-Authenticate).
fonte
No verso do Spring Boot, usei BasicAuthenticationEntryPoint personalizado:
fonte