2010-11-04 18 views
5

Estoy haciendo una aplicación de iPhone basada en PhoneGap que se conectará a un backend de Rails. Estoy usando jQuery para crear una solicitud de Ajax al servidor de Rails. Recibo con éxito una respuesta del servidor, pero estoy teniendo problemas para obtener cookies y administrar sesiones.¿Cómo incluyo las cookies dentro de una respuesta JSON en Rails?

De forma predeterminada, Rails envía un encabezado Set-cookie al responder a una solicitud HTML. Esto no parece suceder cuando Rails envía una respuesta JSON a una solicitud de Ajax.

¿Hay alguna manera de enviar un encabezado Set-cookie cuando se realiza una solicitud Ajax a un servidor Rails?

Aquí es lo que tengo en mi ApplicationController (estoy usando Diseñar para la autenticación):

def sign_in_and_redirect(resource_or_scope, resource=nil) 
scope  = Devise::Mapping.find_scope!(resource_or_scope) 
resource ||= resource_or_scope 
sign_in(scope, resource) unless warden.user(scope) == resource 
respond_to do |format| 
    format.html {redirect_to stored_location_for(scope) || after_sign_in_path_for(resource) } 
    format.json {render :json => { :success => true, :session_id => request.session_options[:id], :current_user => current_user} } 
end 

Aquí está la función de jQuery que estoy utilizando para hacer la petición Ajax

$('#user_submit').click(function(){ 
    $.ajax({beforeSend: function(xhrObj){ xhrObj.setRequestHeader("Accept","application/json");}, 
     type: 'POST', 
     url: 'http://localhost:3000/users/sign_in', 
     data: "{'user':{'remember_me':'0','password':'pass1word','email':'[email protected]'}}", 
     contentType: "application/json", 
     dataType: "application/json", 
     complete: function(data, textStatus){ 
     } 
    }); 
}); 

no he Se obtiene una respuesta clara a través de Google, así que espero que puedas ayudar. He encontrado esto, pero no lo encontré demasiado útil:

http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/66751d8e54f2fee6

Respuesta

0

Parece en efecto, rieles enviar un encabezado set-cookie de forma predeterminada cuando se responde a una petición Ajax JSON. El problema es que Safari no acepta las cookies porque las ve como una fuente externa. Para aceptar las cookies, deberá cambiar las preferencias de seguridad en Safari para "Aceptar cookies" a "Siempre" cuando pruebe aplicaciones de iPhone basadas en HTML en su Safari local.

En Phonegap, se puede hacer el equivalente de esto en algunas de las formas de lo que yo puedo decir:

http://groups.google.com/group/phonegap/browse_thread/thread/3290c5ac4e05be69?fwc=1 http://stackoverflow.com/questions/3709315

0

he conocido al mismo problema y no puedo confirmar lo que dijiste en tu respuesta. Cuando uso curl para hacer una solicitud dos veces, la primera vez con "Aceptar: texto/html" y la segunda vez con "Aceptar: aplicación/json", el servidor no envía un encabezado Set-Cookie en este último caso. Lamentablemente, no he encontrado una solución para esto.

El specification dice:

"Si el agente de usuario soporta HTTP Estado
Gestión de persistir, se descarta y enviar las cookies (como recibido en el Set-Cookie y Set-cookie2 respuesta encabezados y enviado en el encabezado Cookie ) según corresponda. "

Como esta especificación es una Recomendación candidata, es probable que todavía no se haya implementado de forma coherente en todos los navegadores. Por lo tanto, el servidor puede omitir la configuración de cookies, no sé.

Cuestiones relacionadas