¿Envía credenciales con publicaciones entre dominios?

81

De acuerdo con las solicitudes con credenciales , Firefox solo enviará credenciales junto con publicaciones entre dominios si

invocation.withCredentials = "true";

está configurado ... Pero no parece que la API Ajax de jQuery proporcione ningún mecanismo para esto.

¿Hay algo que me haya perdido? ¿Hay alguna otra forma en que pueda hacerlo?

David Wolever
fuente

Respuestas:

168

Se supone que la funcionalidad está rota en jQuery 1.5.

Desde jQuery 1.5.1 debe usar xhrFields param.

$.ajaxSetup({
    type: "POST",
    data: {},
    dataType: 'json',
    xhrFields: {
       withCredentials: true
    },
    crossDomain: true
});

Documentos: http://api.jquery.com/jQuery.ajax/

Error informado: http://bugs.jquery.com/ticket/8146

Kangur
fuente
2
Ahora puedo enviar cookies al subdominio :) ¡Gracias!
Radek
7
¿Se supone que esto también funciona para solicitudes ajax cruzadas (sin subdominios)?
farola
Todavía me solicitan las credenciales
John Grabanski
@JohnGrabanski ¿Solucionaste tu problema?
Selman
41

Puede utilizar la beforeSenddevolución de llamada para establecer parámetros adicionales (el XMLHTTPRequestobjeto se le pasa como su único parámetro).

Para tu información, este tipo de solicitud entre dominios no funcionará en un escenario de sitio normal y no con ningún otro navegador. Ni siquiera sé qué limitaciones de seguridad impone FF 3.5, solo para que no te golpees la cabeza contra la pared por nada:

$.ajax({
    url: 'http://bar.other',
    data: { whatever:'cool' },
    type: 'GET',
    beforeSend: function(xhr){
       xhr.withCredentials = true;
    }
});

Una cosa más a tener en cuenta es que jQuery está configurado para normalizar las diferencias del navegador. Puede encontrar que la biblioteca jQuery impone más limitaciones que prohíben este tipo de funcionalidad.

Doug Neiner
fuente
2
De acuerdo con api.jquery.com/jQuery.post , debería ser tipo: "GET" y no método: 'GET'. Me tropecé con él cuando
usé
1
@Xosofox Sé que este es un comentario antiguo, pero a partir de jQuery 1.9, method: 'GET'es compatible. api.jquery.com/jquery.ajax
Brad
1
Tenga en cuenta que esto ya no funciona en jQuery 3+, porque (a) la API de esta función ha cambiado y (b) ya no tiene acceso al objeto XHR, que se crea después de que se ejecuta esta función. En su lugar, debería utilizar xhrFields.
cuniculus
2

En jQuery 3 y quizás versiones anteriores, la siguiente configuración más simple también funciona para solicitudes individuales:

$.ajax(
        'https://foo.bar.com,
        {
            dataType: 'json',
            xhrFields: {
                withCredentials: true
            },
            success: successFunc
        }
    );

El error completo que recibía en Firefox Dev Tools -> pestaña Red (en la pestaña Seguridad para una solicitud individual) era:

Se produjo un error durante una conexión a foo.bar.com. El interlocutor de SSL no pudo negociar un conjunto aceptable de parámetros de seguridad. Código de error: SSL_ERROR_HANDSHAKE_FAILURE_ALERT

chim
fuente