example ejemplos javascript jquery ajax basic-authentication http-authentication

javascript - ejemplos - Llamadas JQuery Ajax con autenticación básica HTTP



jquery cdn (3)

Tengo un servidor basado en REST con el que estoy intentando comunicarme usando JQuery. Tanto XML como JSON están disponibles como formatos de respuesta, así que estoy usando JSON.

Todas las conexiones son SSL, por lo que la autenticación básica HTTP ha sido nuestro método de autorización de elección, y no hemos tenido problemas con otras aplicaciones (Javascript sin formato, Silverlight, etc.)

Ahora estoy intentando juntar algo con JQuery y tengo un sinfín de problemas al usar la autenticación básica HTTP.

He revisado numerosas preguntas previas, la mayoría de las cuales tienen soluciones que parecen no funcionar o culpan de todo el problema al acceso de origen cruzado, que ya he superado en las pruebas básicas de Javascript. Las respuestas siempre proporcionan el conjunto Access-Control-Allow-Origin al encabezado Origin proporcionado en la solicitud, y esto se puede ver en las respuestas de mis pruebas.

En javascript básico, esta llamada completa se realiza muy simplemente con:

req.open(''GET'', ''https://researchdev-vm:8111/card'', true, ''test'', ''testpassword'');

El intento de JQuery en esto es bastante estándar:

$.ajax({ username: ''test'', password: ''testpassword'', url: ''https://researchdev-vm:8111/card'', type: ''GET'', dataType: ''json'', crossDomain: true, /*data: { username: ''test'', password: ''testpassword'' },*/ beforeSend: function(xhr){ xhr.setRequestHeader("Authorization", //"Basic " + encodeBase64(username + ":" + password)); "Basic AAAAAAAAAAAAAAAAAAA="); }, sucess: function(result) { out(''done''); } });

El único método que parece funcionar para proporcionar autenticación es la inserción directa de los datos codificados en Base64 en la función beforeSend() . Si esto no está incluido, no hay progreso realizado en absoluto. Las propiedades de nombre de usuario y contraseña parecen ser ignoradas por completo.

Con el comportamiento beforeSend() proporcionado, la llamada GET obtiene una respuesta positiva con los datos incluidos. Sin embargo, debido a que se trata de una llamada entre sitios, una llamada OPCIONES se realiza antes de la llamada GET y siempre falla, porque no hace uso de beforeSend() y, por lo tanto, recibe una respuesta 401 debido a una autenticación fallida.

¿Hay una mejor manera de lograr lo que debería ser una llamada muy trivial? ¿El hecho de que la solicitud de OPCIONES no haga uso del procesamiento de la función beforeSend() se considere un error? ¿Hay tal vez una manera de deshabilitar la comprobación de OPCIONES por completo? No es posible hacer esta llamada no entre sitios, ya que Javascript parece considerar incluso un número de puerto diferente en la misma máquina que "sitio cruzado".


Aquí hay algo que actúa como una autenticación de paso para las llamadas AJAX. Esto se basa en NTLM para autenticarse en la página desde la que se ejecutará el javascript. Tal vez esto te ayude:

Código PHP:

<?php $headers = apache_request_headers(); if (isset($headers[''Authorization''])) echo "<script>var auth = " . $headers[''Authorization''] . "</script>"; unset($headers); ?>

Usando jQuery lo usarías de esta manera:

$.ajax({ type: ''POST'', url: ''./somePage.php'', data: {"test":true}, dataType: ''json'', success: function(data) { console.log(data.username); }, beforeSend : function(req) { req.setRequestHeader(''Authorization'', auth); // <<<<----- USED HERE }, });

Para XMLHttpRequest estándar:

var xml = new XMLHttpRequest(); xml.open(''GET'', ''./somePage.php'', true); xml.setRequestHeader(''Authorization'', auth); // <<<<----- USED HERE xml.send();


Para cualquiera que llegue a través de este problema, he resuelto el problema al interceptar las solicitudes de OPCIONES con Apache y reenviar solo GET y POST al servidor.

Esta solución es independiente del servidor de aplicaciones y, por lo tanto, funciona también para PHP y Java:

<VirtualHost *:80> # ServerName and other configuration... # CORS Header set Access-Control-Allow-Origin "*" Header set Access-Control-Allow-Methods "OPTIONS, GET, PUT, POST" Header set Access-Control-Allow-Headers "Authorization" # Intercept OPTIONS calls RewriteEngine On RewriteCond %{REQUEST_METHOD} ^(OPTIONS)$ RewriteRule .* - [L] # Backend, adapt this line to fit your needs RewriteRule /(.*) ajp://localhost:8010/$1 [L,P] </VirtualHost>

Saludos, Maurizio


Probablemente esta pregunta haya pasado su fecha de caducidad, pero estaba trabajando con el mismo problema con Jquery y encontré el mismo problema.

Los atributos de nombre de usuario y contraseña no parecen hacer una codificación base64 del nombre de usuario / contraseña como lo hace normalmente para lograr la autenticación básica HTTP.

Mire las siguientes solicitudes (abreviadas por brevedad), primero utilizando los parámetros "nombre de usuario" y "contraseña" en el método AJAX de JQuery:

Request URL:http://testuser%40omnisoft.com:testuser@localhost:60023/Account Request Method:GET Accept:application/json, text/javascript, */*; q=0.01 Host:localhost:60023

Y ahora con el método beforeSend:

Request URL:http://localhost:60023/Account Request Method:GET Accept:application/json, text/javascript, */*; q=0.01 Authorization:Basic dXNlcm5hbWU6cGFzc3dvcmQ= Host:localhost:60023

Tenga en cuenta que el primer método no incluye un encabezado de ''Autorización'' en la solicitud, sino que prefija la URL de destino. No soy experto en autenticación básica HTTP, pero indicaría que la primera no es una implementación adecuada y, por lo tanto, falla (o al menos lo hace con mi propia implementación de servidor).

En cuanto a su solicitud de OPCIONES utilizando JSONP, podría intentar usar ?callback=? en su URL en lugar de usar la opción de crossdomain , solo para ser explícito.