角度注销后无法验证 CSRF 令牌的真实性

Posted

技术标签:

【中文标题】角度注销后无法验证 CSRF 令牌的真实性【英文标题】:after angular logout Can't verify CSRF token authenticity 【发布时间】:2016-02-27 09:49:42 【问题描述】:

重复步骤

登录 注销 登录并从服务器获取 422 无法验证 CSRF 令牌的真实性

宝石 设计 3.5.2 devise_token_auth 0.1.36

根据其他线程,解决方案是在注销时返回一个新的 csrf 令牌,然后在客户端的注销成功处理程序中将 XSRF-TOKEN 的 cookie 设置为接收到的令牌。我正在使用的代码如下。有人可以告诉我为什么它不起作用吗?最后一个登录请求似乎正在使用新令牌,因此角度看起来像是从 cookie 中获取的。

我正在重写 devise_token_auth 销毁方法并在渲染中添加 csrfParam 和 csrfToken 以传递给客户端。这个 csrfToken 是否需要存储在服务器上的某个地方,以便在下一个请求通过时进行比较?

  def destroy
    # remove auth instance variables so that after_filter does not run
    user = remove_instance_variable(:@resource) if @resource
    client_id = remove_instance_variable(:@client_id) if @client_id
    remove_instance_variable(:@token) if @token

    if user and client_id and user.tokens[client_id]
      user.tokens.delete(client_id)
      user.save!

      render json: 
    success:true,
    csrfParam: request_forgery_protection_token,
    csrfToken: form_authenticity_token
      , status: 200

    else
      render_destroy_error
    end
  end

这是 ng-token-auth signOut 的客户端成功回调。

$auth.signOut()
      .then(function(resp) 

    $('meta[name=csrf-token]').attr('content', resp.data.csrfToken);
    $cookieStore.put($http.defaults.xsrfCookieName, resp.data.csrfToken);
    $http.defaults.headers.common[$http.defaults.xsrfHeaderName] = resp.data.csrfToken;

    $state.go('login');
      )
      .catch(function(resp) 
    // handle error response
    console.log("error signing out");
      );

我跟着下面的问题,这与我的相似,但没有任何运气。 Rails, Devise authentication, CSRF issue https://github.com/lynndylanhurley/devise_token_auth/issues/398

【问题讨论】:

【参考方案1】:

我遇到了同样的问题,发现这篇文章让我得到了几个不同的答案。 Rails, Devise authentication, CSRF issue

我使用了卢卡斯的答案,这对我有用。您需要做的就是将此行放在 config/initializers/devise.rb 中。

config.sign_out_all_scopes = false

【讨论】:

太棒了!这有点让人头疼。

以上是关于角度注销后无法验证 CSRF 令牌的真实性的主要内容,如果未能解决你的问题,请参考以下文章

警告:无法使用设计验证 CSRF 令牌的真实性

无法验证 CSRF 令牌真实性 Rails 4.1

警告:无法验证 CSRF 令牌的真实性

Rails post 无法验证 CSRF 令牌的真实性

无法在 Rails 中验证 CSRF 令牌的真实性

Rails 3:无法验证 CSRF 令牌的真实性