设计AJAX - POST请求:current_user为null

时间:2013-05-18 15:47:57

标签: ruby-on-rails angularjs devise cross-domain

我尝试使用身份验证开发单页面应用程序。我使用Devise(Rails)和AngularJS。 由于某些不同的原因,我的rails应用程序和我的angularjs应用程序不在同一台服务器上。所以,我必须处理跨域问题...我不能在我的标题中发送X-CSRF-Token。 我可以正确登录并注销并发送GET请求而不会出现问题。在我的rails控制器中,我可以使用current_user,它已正确设置。 但是,当我发送POST请求时,current_user为null。似乎我的session_id没有发送。问题是由于跨域,因为如果我从同一台服务器发送我的ajax请求,那就没关系。

我想,我有两个解决方案: - 不要使用基于身份验证的cookie,而是使用令牌 - 将前端和后端放在同一台服务器上。

其他想法?当我从跨域发送POST请求时,为什么current_user为null?

1 个答案:

答案 0 :(得分:4)

您可以在标题中发送CSRF令牌但是这是一种暴露一些安全漏洞的错误做法(issue thread on github explaining why

最安全的方法是同时禁用CSRF

class ApplicationController < ActionController::Base
  # or use Api::BaseController < ApplicationController if you are namespacing
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :null_session
end

AND 使用基于令牌的身份验证,您可以implement yourself或使用设计:token_authenticatable。您必须配置AngularJS以在params或headers中发送令牌。这是一个片段,我用它让轨道弄清楚如果令牌在标题或参数中。

class Api::BaseController < ApplicationController
  prepend_before_filter :get_auth_token 

  private
  def get_auth_token
    if auth_token = params[:auth_token].blank? && request.headers["X-AUTH-TOKEN"]
      params[:auth_token] = auth_token
    end
  end
end

所以最终它是如何工作的:

  1. 客户端使用您定义的登录方法进行身份验证
  2. 从服务器获取身份验证令牌
  3. 在每个后续请求中使用令牌以进行授权