2013-03-21 9 views
5

Ich habe Devise Authentifizierung über GET abzumelden, konnte es aber nicht diese Angularjs Code machen sich abzumelden:Kann nicht Devise machen, um sich abzumelden von Angularjs

$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 des Logout-Verhalten scheint zufällig sein - manchmal meldet es sich ab, manchmal nicht. Und wenn ich /users/sign_out in die Adressleiste des Browsers eingeben, meldet es sich immer ab.

Ok, schaltete ich die Protokoll der Authentifizierung Devise aus Anforderung POST Caching Probleme loszuwerden und verwenden folgenden Angularjs Code:

$scope.logout = -> 
    $http.post('/users/sign_out').success -> 
    $location.path('editor') 

Das erste Mal ist es in Ordnung abgemeldet, wie immer, aber dann Ich konnte es nicht schaffen mich auszuloggen.

Ich beschloss, meine eigene Methode, um zu sehen, was passiert, zu machen:

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 

und festgestellt, dass nach sign_out die current_user immer null ist, dann aber wie durch ein Wunder die Angular Anwendung verwaltet andere Methoden der ApiController zuzugreifen, und current_user ist nicht Null!

Ich verstehe das nicht. Ok, nehmen wir an, dass eine andere HTTP-Anfrage unmittelbar nach der (oder zur gleichen Zeit) Abmeldeanforderung, dem Übergeben des Authentifizierungscookies und der Neuanmeldung von Devices folgen kann, aber nicht die in Cookie übergebene Sitzungs-ID ablaufen sollte sofort nach dem Aufruf der sign_out Methode ?!

+0

Haben Sie Ihre sign_out [Route a: Route in devise.rb?] (Http://stackoverflow.com/questions/6557311/no-route-matches-users-sign-out-devise-rails-3)) – shicholas

+1

@shicholas: natürlich – Paul

+0

Wie wäre es mit Rails Cookies oder ng Cookies? – shicholas

Antwort

2

leid, dass ich nie zuvor geantwortet, hoffen, dass diese

Mein Sesisons-Controller

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

Meine Devise Sessions-Controller I

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 
overrode hilft

Wie Sie sehen können, bin ich nicht mit Rails-Cookies und damit meine Antwort möglicherweise nicht. Wenn ich das getan hätte, würde ich wahrscheinlich eine Zeile wie Session [: user] = nil in meine Aktion "destroy" einfügen.

+0

Entfernen Sie jetzt die Aufrufe von "$ cookieStore.remove" und sehen Sie, ob sie sich wirklich serverseitig abmelden. Btw: Devise hat keine Cookies mit den Namen '_pf_session',' _pf_name', '_pf_email' – Paul

+0

die beiden Systeme laufen parallel und sprechen nur über JSON miteinander. Bei der Anmeldung erstellt Angular im Browser die Cookies "pf_session", "pf_name" und "pf_email". Der Server stellt lediglich sicher, dass keine Anfragen ohne ein von einem Gerät erzeugtes Token autorisiert sind. Wenn eine unautorisierte Anfrage gesendet wird, habe ich [Witolds HTTP Interceptor] (http://witolsz.github.io/angular-http-auth/) verwendet, um meine Client-App auf eine nicht autorisierte Anfrage hin auszuflippen. Aber nachdem ich letzte Nacht mit meiner Ruby-Gruppe gesprochen habe, könnte es CSRF-Probleme geben und ich sollte Rails-Cookies verwenden. Ich werde posten, wenn ich das herausfinde. – shicholas

Verwandte Themen