Estoy tratando de crear una autenticación básica a través del navegador, pero realmente no puedo llegar allí.
Si este script no está aquí, la autenticación del navegador se hará cargo, pero quiero decirle al navegador que el usuario está a punto de realizar la autenticación.
La dirección debería ser algo como:
http://username:[email protected]/
Tengo un formulario:
<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>
Y un guión:
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
fuente
fuente
Respuestas:
Use la
beforeSend
devolución de llamada de jQuery para agregar un encabezado HTTP con la información de autenticación:fuente
beforeSend: function(xhr) { xhr.setRequestHeader("Authorization", "Basic " + btoa(username + ":" + password)); };
funciona para míCómo cambian las cosas en un año. Además del atributo de encabezado en lugar de
xhr.setRequestHeader
, jQuery actual (1.7.2+) incluye un atributo de nombre de usuario y contraseña con la$.ajax
llamada.EDITAR a partir de comentarios y otras respuestas: Para ser claros, para enviar autenticación de forma preventiva sin una
401 Unauthorized
respuesta, en lugar desetRequestHeader
(pre -1.7) use'headers'
:fuente
username
y nouser
? Además, no es exactamente lo mismo: de los docos en línea y mi experiencia parece que no es preventiva como requieren algunas API. En otras palabras, envía elAuthorization
encabezado solo cuando se devuelve un código 401.Use la devolución de llamada beforeSend para agregar un encabezado HTTP con la información de autenticación de esta manera:
fuente
O simplemente use la propiedad de encabezados introducida en 1.5:
Referencia: jQuery Ajax API
fuente
Los ejemplos anteriores son un poco confusos, y esta es probablemente la mejor manera:
Tomé lo anterior de una combinación de la respuesta de Rico y Yossi.
La función btoa Base64 codifica una cadena.
fuente
$.ajaxSetup()
dice "Establecer valores predeterminados para futuras solicitudes de Ajax. No se recomienda su uso " .Como otros han sugerido, puede configurar el nombre de usuario y la contraseña directamente en la llamada Ajax:
O use la propiedad de encabezados si prefiere no almacenar sus credenciales en texto sin formato:
De cualquier forma que lo envíe, el servidor debe ser muy cortés. Para Apache, su archivo .htaccess debería verse así:
Explicación:
Para algunas solicitudes de dominio cruzado, el navegador envía una solicitud de OPCIONES de verificación previa a la que le faltan los encabezados de autenticación. Envuelva sus directivas de autenticación dentro de la etiqueta LimitExcept para responder correctamente a la verificación previa.
Luego, envíe algunos encabezados para indicarle al navegador que tiene permiso para autenticarse y que Access-Control-Allow-Origin otorgue permiso para la solicitud entre sitios.
En algunos casos, el comodín * no funciona como un valor para Access-Control-Allow-Origin: debe devolver el dominio exacto de la persona que llama. Use SetEnvIf para capturar este valor.
fuente
Utilice la función jQuery ajaxSetup , que puede configurar valores predeterminados para todas las solicitudes de ajax.
fuente
JSONP no funciona con autenticación básica, por lo que la devolución de llamada jQuery beforeSend no funcionará con JSONP / Script.
Logré evitar esta limitación agregando el usuario y la contraseña a la solicitud (por ejemplo, usuario: [email protected]). Esto funciona con prácticamente cualquier navegador, excepto Internet Explorer, donde la autenticación a través de URL no es compatible (la llamada simplemente no se ejecutará).
Consulte http://support.microsoft.com/kb/834489 .
fuente
Hay 3 formas de lograr esto como se muestra a continuación
Método 1:
Método 2:
Método 3:
fuente
Según la respuesta de SharkAlley, también funciona con nginx.
Estaba buscando una solución para obtener datos mediante jQuery desde un servidor detrás de nginx y restringido por Base Auth. Esto funciona para mi:
Y el código JavaScript es:
Artículo que me parece útil:
fuente