设计AJAX - POST请求:current_user为空



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

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

还有其他想法吗?为什么current_user是空的,当我从跨域发送POST请求?

你可以在header中发送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_authenticatable。你必须配置AngularJS在params或header中发送令牌。下面是我用来让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. 在随后的每个请求中使用令牌进行授权

相关内容

  • 没有找到相关文章

最新更新