加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 设计AJAX – POST请求:current_user为null

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

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

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

解决方法

您可以在标题中发送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

并使用基于令牌的身份验证,您可以使用implement yourself或使用devise的: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

所以最终它的工作原理是:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读