在具有跨域的sign_in之后未设置Set-Cookie会话

时间:2012-07-30 19:35:17

标签: jquery ruby-on-rails api devise cors

我有一个有2个子域的rails应用程序:

  • API (CORS)=> api.myapp.dev
  • 网络应用 => myapp.dev

我只能通过auth_token访问我的API,这是在用户使用Devise进行身份验证后立即返回的。但是,我的客户端(Web应用程序)没有设置这些cookie。我错过了什么吗?

class Api::V1::SessionsController < Api::V1::BaseController

  def create
    @user = User.find_for_database_authentication(:email => params[:user][:email])

    if @user and @user.valid_password?(params[:user][:password])
      sign_in @user # Set-Cookie header response with the session
      render "api/v1/users/preview", :handlers => :rabl # return auth_token here
    else
      flash[:error] = I18n.t('devise.failure.invalid')
      render "api/v1/base/error", :handlers => :rabl, :status => :unprocessable_entity 
    end
  end
end

1 个答案:

答案 0 :(得分:1)

出于安全原因,您无法从跨域网站设置Cookie。但是,jQuery.ajax允许您通过明确设置以下选项来执行此操作:

$.ajax
  type: "POST"
  url: "api.mydomain.com/login"
  xhrFields:
    withCredentials: true

另外,请务必从HTTP响应中返回headers['Access-Control-Allow-Credentials'] = "true"