5

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 メソッドの呼び出し後?!

4

1 に答える 1

2

申し訳ありませんが、以前に返信したことがありません。これが役立つことを願っています

私のセッションコントローラー

$scope.signOutUser = function () {
  $http.delete('/api/users/sign_out', {
    auth_token: Session.currentUser // just a cookie storing my token from devise token authentication.
  }).success( function(result) {
    $cookieStore.remove('_pf_session');
    $cookieStore.remove('_pf_name');
    $cookieStore.remove('_pf_email');
    location.reload(true); // I need to refresh the page to update cookies
  }).error( function(result) {
    console.log(result);
  });
} 

オーバーライドした私のデバイス セッション コントローラー

class SessionsController < Devise::SessionsController
  before_filter :authenticate_user!, only: :destroy

  def destroy
    token = params[:auth_token]
    @user = User.find_by_authentication_token(token)
    @user.reset_authentication_token!
    sign_out(@user)
    render status: :ok, json: {message: "You have successfully logged out"}
  end
end

ご覧のとおり、私は Rails Cookie を使用していないため、私の回答は当てはまらない可能性があります。もしそうなら、私はおそらく私の破棄アクションに session[:user] = nil のような行を追加するでしょう。

于 2013-06-12T21:27:34.663 に答える