我通过 GET 进行了 Devise 身份验证以注销,但无法使用以下 Angular.js 代码注销:
$scope.logout = ->
$http.get('/users/sign_out').success ->
#If it does not redirect from 'editor' to 'login' then you haven't actually logged out
$location.path('editor')
Devise 的注销行为似乎是随机的——有时会注销,有时不会。如果我进入/users/sign_out
浏览器的地址栏,它总是会注销。
好的,我将 Devise 身份验证的注销切换为 POST 请求以消除缓存问题并使用以下 Angular.js 代码:
$scope.logout = ->
$http.post('/users/sign_out').success ->
$location.path('editor')
和往常一样,第一次注销很好,但后来我无法注销。
我决定制作自己的方法来看看会发生什么:
match '/logout' => 'api#logout', :via => :post
class ApiController < ApplicationController
before_filter :authenticate_user!
def logout
sign_out
if current_user
puts 'Has not signed out!'
else
puts 'Has signed out!'
end
head :ok
end
end
并检测到sign_out
始终current_user
为 nil,但随后 Angular 应用程序奇迹般地设法访问了 ApiController 的其他方法,并且 current_user 不在那里!
我不明白这个。好的,让我们假设在注销请求之后(或同时)可能会跟随其他一些 HTTP 请求,通过身份验证 cookie 并设计重新登录,但在 cookie 中传递的会话 ID 不应该立即过期调用sign_out方法后?!