Devise 認証で GET 経由でログアウトするようにしましたが、この 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
ブラウザのアドレスバーに入ると、常にログアウトします。
OK、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
その後、常に nil であることを検出しましたcurrent_user
が、Angular アプリケーションは何らかの奇跡によって ApiController の他のメソッドにアクセスでき、 current_user はそこに nil ではありません!
私はそれを理解していません。わかりました、ログアウト要求の直後 (またはそれと同時に)、認証 Cookie を渡し、Devise が再ログインする、他の HTTP 要求が続く可能性があると仮定しましょう。 sign_out メソッドの呼び出し後?!