2013-03-21 10 views
5

zrobiłem uwierzytelniania opracować, aby zalogować się za pośrednictwem GET, ale nie mógł zrobić to zalogować się przy użyciu tego kodu angularjs:nie można zrobić, aby wylogować się opracować od 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') 

zachowanie wylogowania opracować wydaje się być losowym - czasami się wylogowuje, czasem nie. A jeśli wprowadzę /users/sign_out na pasku adresu przeglądarki, wyloguje się zawsze.

Ok, przeszedłem dziennik uwierzytelniania opracować OUT POST żądanie, aby pozbyć się problemów buforowania i stosowane następujące kodu angularjs:

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

Pierwszy raz wylogować dobrze, jak zawsze, ale potem Nie mogłem go wylogować.

postanowiłem zrobić mój własny sposób, aby zobaczyć, co się dzieje:

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 

i wykrył, że po sign_outcurrent_user zawsze jest zerowa, ale wtedy kątowe aplikacja jakimś cudem udaje się uzyskać dostęp do innych metod ApiController, a current_user nie ma tam nikogo!

Nie rozumiem tego. OK, załóżmy, że może nastąpić inne żądanie HTTP, zaraz po (lub w tym samym czasie co) żądaniu wylogowania, przekazaniu pliku cookie uwierzytelniającego i Wykrywaniu ponownych logowań, ale nie powinien wygasać identyfikator sesji przesłany w ciasteczku natychmiast po wywołaniu metody sign_out ?!

+0

czy zrobiłeś swoje sign_out [route a: uzyskać trasę w devise.rb?] (Http://stackoverflow.com/questions/6557311/no-route-matches-users-sign-out-devise-rails-3) – shicholas

+1

@shicholas: oczywiście – Paul

+0

co powiesz na rails cookies lub ng cookies? – shicholas

Odpowiedz

2

Niestety nigdy nie odpowiedział wcześniej, mam nadzieję, że to pomaga

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

My Devise Sesje Controller I overrode

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 

Jak widać, nie jestem używając Railsowych ciasteczek, a zatem moja odpowiedź może nie dotyczyć. Gdybym to zrobił, prawdopodobnie dodalbym linię typu session [: user] = nil w mojej akcji destroy.

+0

Teraz usuń wywołania '$ cookieStore.remove' i sprawdź, czy rzeczywiście wylogowuje się po stronie serwera. Btw: Devise nie ma ciasteczek z nazwami '_pf_session',' _pf_name', '_pf_email'' – Paul

+0

oba systemy działają równolegle i rozmawiają tylko ze sobą za pośrednictwem JSON. Podczas logowania Angular tworzy w przeglądarce pliki cookie 'pf_session',' pf_name' i 'pf_email'. Serwer upewnia się, że żadne żądania bez wygenerowanego tokena są autoryzowane. W przypadku wysłania nieautoryzowanego żądania użyłem [Witold's HTTP Interceptor] (http://witoldsz.github.io/angular-http-auth/), aby aplikacja po stronie klienta została odrzucona po otrzymaniu nieautoryzowanego żądania. Jednak po wczorajszej rozmowie z moją grupą rubinową mogą pojawić się problemy z CSRF i powinienem używać ciastek szynowych. Będę pisać, kiedy to wymyślę. – shicholas

Powiązane problemy