角度注销后无法验证 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 令牌的真实性的主要内容,如果未能解决你的问题,请参考以下文章