【问题标题】:Devise AJAX - POST request : current_user is null设计 AJAX - POST 请求:current_user 为空
【发布时间】:2013-05-13 15:04:32
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    您可以在标头中发送 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 或使用 devise 的 :token_authenticable。您必须配置 AngularJS 以在参数或标头中发送令牌。这是我用来让 rails 确定令牌是否在标头或参数中的 sn-p。

    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. 在每个后续请求中使用令牌来进行授权

    【讨论】:

    • 谢谢,:authentication_token 是否与 oAuth2 兼容以进行 SSO 身份验证(如 Facebook)?顺便问一下,我可以使用 oAuth 来管理我的令牌吗?
    • 是的,你可以让它一起工作。这只是您要附加给用户的另一种身份验证类型,这是一个不错的 rails casts 插曲railscasts.com/episodes/235-omniauth-part-1。如果您将自己的应用程序视为另一个身份验证提供程序,那么我相信这是可能的,但不确定这是否会带来好处。事情是 devise 已经有一个系统来管理自己的令牌。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 2020-07-16
    • 2022-06-14
    • 2016-05-20
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    相关资源
    最近更新 更多