4

我尝试开发带有身份验证的单页应用程序。我使用设计(Rails)和 AngularJS。由于某些不同的原因,我的 rails 应用程序和 angularjs 应用程序不在同一台服务器上。所以,我必须处理跨域问题......而且我无法在我的标题中发送 X-CSRF-Token 。我可以正确登录和注销并毫无问题地发送 GET 请求。在我的 Rails 控制器中,我可以使用 current_user,它设置正确。但是,当我发送 POST 请求时, current_user 为空。看来我的 session_id 没有发送。问题是由于跨域造成的,因为如果我从同一台服务器发送我的 ajax 请求,就可以了。

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

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

4

1 回答 1

4

您可以在标头中发送 CSRF 令牌但是这是一种暴露一些安全漏洞的不好做法(github 上的问题线程解释了原因

最安全的方法是一起禁用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

使用基于令牌的身份验证,您可以自己实现或使用设计的:token_authenticable。您必须配置 AngularJS 以在参数或标头中发送令牌。这是我用来让 rails 确定令牌是否在标头或参数中的片段。

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. 在每个后续请求中使用令牌进行授权
于 2013-05-18T17:34:13.600 回答