2013-03-21 12 views
5

からログアウトして作ることができない私は、GETを介してログインする工夫認証を作ったが、それは、このコードをAngular.js使ってログインすることができませんでした:は工夫が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') 

考案のログアウト動作がいるようですランダムになる - 時にはログアウトする、時にはログアウトしない。 ブラウザのアドレスバーに/users/sign_outと入力すると、常にログアウトします。 [OK]を

は、私が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_outcurrent_userは常にゼロであることを検出したが、その後、いくつかの奇跡によって角度アプリケーションはApiControllerの他のメソッドにアクセスするために管理しますcurrent_userはそこにはありません!

私はそれを理解していません。さて、ログアウトリクエストの直後(または同時に)に、他のHTTPリクエストに続いて、認証クッキーとDevise再ログインを渡すかもしれないが、は、クッキーで渡されたセッションIDが期限切れにならないようにするsign_outメソッドの呼び出し直後ですか?

+0

あなたはsign_outを作成しましたか?[ルート:devise.rbでルートを取得しますか?](http://stackoverflow.com/questions/6557311/no-route-matches-users-sign-out-devise-rails-3 ) – shicholas

+1

@shicholas:もちろん – Paul

+0

どのようにレールクッキーまたはngクッキー? – shicholas

答えて

2

私はあなたが見ることができるように、私はありません

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 

をオーバーライドこれが役に立てば幸い

マイSesisonsコントローラ

$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); 
    }); 
} 

私の工夫セッションコントローラ、先に答えたことはありません申し訳ありませんRailsのクッキーを使っているので、私の答えは関係ないかもしれません。もし私がしたら、おそらく私の破壊操作にsession [:user] = nilのような行を追加するでしょう。

+0

これで、 '$ cookieStore.remove'呼び出しを削除し、実際にサーバー側でログアウトしているかどうかを確認します。 Btw:Devitsは '_pf_session'、' _pf_name'、 '_pf_email'という名前のクッキーを持っていません – Paul

+0

2つのシステムは並行して動作し、JSONを介してのみ互いに​​通信します。サインイン時、Angularはブラウザーに 'pf_session'、' pf_name'と 'pf_email'クッキーを作成します。サーバーは、生成されたトークンを使用していない要求は許可されていないことを確認します。許可されていないリクエストが送信された場合、私は[WitoldのHTTPインターセプタ](http://witoldsz.github.io/angular-http-auth/)を使用して、クライアント側のアプリが不正なリクエストを受けたときに解除します。しかし、昨夜私のルビーグループと話した後、CSRFの問題がいくつか起きるかもしれないし、レールクッキーを使うべきだ。私はそれを理解するときに投稿します。 – shicholas