2013-03-21 8 views
5

ho fatto l'autenticazione Devise per uscire via GET, ma non poteva fare il login utilizzando questo codice Angular.js:Non può fare Devise per eseguire il logout 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') 

comportamento di logout di Devise sembra essere casuali - a volte si disconnette, a volte no. E se inserisco /users/sign_out nella barra degli indirizzi del browser, si disconnette sempre.

Ok, ho acceso log del autenticazione Devise fuori a Inserisci richiesta per sbarazzarsi di problemi di memorizzazione nella cache e utilizzati seguente codice Angular.js:

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

La prima volta è disconnesso bene, come sempre, ma poi Non potevo farlo per uscire.

ho deciso di fare il mio metodo per vedere cosa succede:

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 

e ha rilevato che dopo sign_out il current_user è sempre pari a zero, ma poi l'applicazione angolare per qualche miracolo riesce ad accedere ad altri metodi di ApiController, e current_user non è nullo lì!

Non lo capisco. Ok, supponiamo che possa seguire qualche altra richiesta HTTP, subito dopo (o allo stesso tempo) richiesta di logout, passando il cookie di autenticazione e Devise ri-login, ma non dovrebbe essere scaduto l'ID di sessione passato in cookie subito dopo la chiamata del metodo sign_out ?!

+0

hai fatto il tuo sign_out [percorso a: ottieni percorso in devise.rb?] (Http://stackoverflow.com/questions/6557311/no-route-matches-users-sign-out-devise-rails-3) – shicholas

+1

@shicholas: ovviamente – Paul

+0

che ne dici di cookie di rails o di cookie ng? – shicholas

risposta

2

dispiace non ho mai risposto in precedenza, speriamo che questo aiuta

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

mio Devise Sessions controller ho calpestato

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 

Come potete vedere, io non sono utilizzando i cookie Rails e quindi la mia risposta potrebbe non essere pertinente. Se lo facessi probabilmente aggiungerei una riga come session [: user] = nil nella mia azione destroy.

+0

Rimuovere ora le chiamate '$ cookieStore.remove' e vedere se si disconnette realmente dal lato server. Btw: Devise non ha cookie con i nomi '_pf_session',' _pf_name', '_pf_email' – Paul

+0

i due sistemi funzionano in parallelo e parlano tra loro solo tramite JSON. All'accesso, Angular crea i cookie 'pf_session',' pf_name' e 'pf_email' nel browser. Il server si limita a garantire che nessuna richiesta senza un token generato da devise sia autorizzata. Se viene inviata una richiesta non autorizzata, ho usato [Witold's HTTP Interceptor] (http://witoldsz.github.io/angular-http-auth/) per far sì che l'app lato client si capovolgi su una richiesta non autorizzata. Tuttavia, dopo aver parlato con il mio gruppo di ruby ​​la scorsa notte potrebbero esserci alcuni problemi di CSRF e che dovrei usare i cookies di rails. Pubblicherò quando lo capirò. – shicholas

Problemi correlati