登錄
退出
登錄,並從服務器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
太棒了!這有點令人頭疼。 –