Estou tentando criar uma autenticação básica através do navegador, mas não consigo chegar lá.
Se esse script não estiver aqui, a autenticação do navegador assumirá o controle, mas quero informar ao navegador que o usuário está prestes a fazer a autenticação.
O endereço deve ser algo como:
http://username:[email protected]/
Eu tenho um formulário:
<form name="cookieform" id="login" method="post">
<input type="text" name="username" id="username" class="text"/>
<input type="password" name="password" id="password" class="text"/>
<input type="submit" name="sub" value="Submit" class="page"/>
</form>
E um script:
var username = $("input#username").val();
var password = $("input#password").val();
function make_base_auth(user, password) {
var tok = user + ':' + password;
var hash = Base64.encode(tok);
return "Basic " + hash;
}
$.ajax
({
type: "GET",
url: "index1.php",
dataType: 'json',
async: false,
data: '{"username": "' + username + '", "password" : "' + password + '"}',
success: function (){
alert('Thanks for your comment!');
}
});
javascript
jquery
ajax
authentication
Patrioticcow
fonte
fonte
Respostas:
Use o
beforeSend
retorno de chamada do jQuery para adicionar um cabeçalho HTTP com as informações de autenticação:fonte
beforeSend: function(xhr) { xhr.setRequestHeader("Authorization", "Basic " + btoa(username + ":" + password)); };
funciona para mim #Como as coisas mudam em um ano. Além do atributo de cabeçalho no lugar de
xhr.setRequestHeader
, o jQuery atual (1.7.2+) inclui um atributo de nome de usuário e senha na$.ajax
chamada.EDITAR a partir de comentários e outras respostas: Para ser claro - para enviar preventivamente a autenticação sem uma
401 Unauthorized
resposta, em vez desetRequestHeader
(pré--1.7) use'headers'
:fonte
username
e nãouser
? Também não é exatamente o mesmo: pelos documentos on-line e pela minha experiência, parece que não é preventivo, como exigem algumas APIs. Em outras palavras, ele envia oAuthorization
cabeçalho somente quando um código 401 é retornado.Use o retorno de chamada beforeSend para adicionar um cabeçalho HTTP com as informações de autenticação da seguinte maneira:
fonte
Ou simplesmente use a propriedade headers introduzida na 1.5:
Referência: API do jQuery Ajax
fonte
Os exemplos acima são um pouco confusos, e esta é provavelmente a melhor maneira:
Peguei o acima de uma combinação da resposta de Rico e Yossi.
A função btoa Base64 codifica uma sequência.
fonte
$.ajaxSetup()
diz "Defina valores padrão para solicitações futuras do Ajax. Seu uso não é recomendado. "Como outros sugeriram, você pode definir o nome de usuário e a senha diretamente na chamada do Ajax:
OU use a propriedade headers se você preferir não armazenar suas credenciais em texto sem formatação:
Qualquer que seja a forma de envio, o servidor deve ser muito educado. Para o Apache, seu arquivo .htaccess deve ser algo assim:
Explicação:
Para algumas solicitações de domínio cruzado, o navegador envia uma solicitação de OPTIONS de comprovação sem os cabeçalhos de autenticação. Coloque suas diretivas de autenticação dentro da marca LimitExcept para responder adequadamente à comprovação.
Em seguida, envie alguns cabeçalhos para informar ao navegador que ele pode se autenticar e o Access-Control-Allow-Origin para conceder permissão para a solicitação entre sites.
Em alguns casos, o curinga * não funciona como um valor para Access-Control-Allow-Origin: Você precisa retornar o domínio exato do chamado. Use SetEnvIf para capturar esse valor.
fonte
Use a função jQuery ajaxSetup , que pode configurar valores padrão para todas as solicitações de ajax.
fonte
O JSONP não funciona com autenticação básica, portanto, o retorno de chamada jQuery beforeSend não funcionará com JSONP / Script.
Consegui contornar essa limitação adicionando o usuário e a senha à solicitação (por exemplo, usuário: [email protected]). Isso funciona com praticamente qualquer navegador, exceto o Internet Explorer, onde a autenticação por URLs não é suportada (a chamada simplesmente não será executada).
Consulte http://support.microsoft.com/kb/834489 .
fonte
Existem três maneiras de conseguir isso, como mostrado abaixo
Método 1:
Método 2:
Método 3:
fonte
De acordo com a resposta do SharkAlley, ele também funciona com o nginx.
Eu estava procurando uma solução para obter dados pelo jQuery a partir de um servidor atrás do nginx e restrito pelo Auth base. Isso funciona para mim:
E o código JavaScript é:
Artigo que acho útil:
fonte