2013-11-21 10 views
6

Wprowadzam OAuth 2 w mojej aplikacji, mam już login/Odśwież Token, ale mam problemy z wylogowaniem.Odwołanie Odebranego tokena

Mam ten zestaw tras generuje przez odźwiernego:

Routes for Doorkeeper::Engine: 
      authorization GET /authorize(.:format)     doorkeeper/authorizations#new 
      authorization POST /authorize(.:format)     doorkeeper/authorizations#create 
      authorization DELETE /authorize(.:format)     doorkeeper/authorizations#destroy 
        token POST /token(.:format)      doorkeeper/tokens#create 
      applications GET /applications(.:format)    doorkeeper/applications#index 
         POST /applications(.:format)    doorkeeper/applications#create 
     new_application GET /applications/new(.:format)   doorkeeper/applications#new 
     edit_application GET /applications/:id/edit(.:format)  doorkeeper/applications#edit 
      application GET /applications/:id(.:format)   doorkeeper/applications#show 
         PUT /applications/:id(.:format)   doorkeeper/applications#update 
         DELETE /applications/:id(.:format)   doorkeeper/applications#destroy 
authorized_applications GET /authorized_applications(.:format)  doorkeeper/authorized_applications#index 
authorized_application DELETE /authorized_applications/:id(.:format) doorkeeper/authorized_applications#destroy 

co chcę zrobić, to odwołać token na serwerze, więc myślę, że usługi, które muszę nazwać się „DELETE/autoryzować” prawo ? ale próbuję wielu różnych sposobów korzystania z tych usług, a ja tylko naprawiam błędy.

Nawiasem mówiąc, nie wiem, czy poprawne jest odwołanie tokena na serwerze, czy tylko usunięcie go z aplikacji?

PS: Używam AFNetworking 2 w iOS 7 dla mojego klienta.

+0

Głosowałem nad tym pytaniem. Mój klient zapomni o tokenie i odświeży token bez problemu. Tylko serwer nadal ma uwierzytelnionego użytkownika.Gdy klient ponownie uwierzytelni się, otrzyma tego użytkownika. Bardzo prawdopodobne, że to jest coś, co robię źle po stronie serwera. Wydaje się jednak, że serwer powinien zostać poinformowany, że token nie powinien być już honorowany. –

Odpowiedz

4

To tak naprawdę nie odpowiada na pytanie, ale dostarcza powiązanych informacji.

Wystąpił problem, w którym odźwierny potwierdziłby kombinację użytkowników/haseł w żądaniu o przyznanie hasła właściciela zasobów po uprzednim uzyskaniu autoryzacji na prawidłową kombinację użytkownika/hasła. Scenariusz był następujący:

  • klient dostaje pozwolenie korzystania prawidłową nazwę użytkownika i hasło
  • resetuje klienta/zapomina symboliczne zezwolenia w celu zakończenia upoważnienie
  • klient może dostać nową autoryzację za pomocą dowolnej nazwy użytkownika i hasła, upoważnia do oryginalny użytkownik.

Okazało się, że Warden utrzymuje autoryzowanego użytkownika w sesji, a mój klient iOS z przyjemnością utrzymuje dla mnie sesję.

Rozwiązałem to, ponieważ strażnik natychmiast wylogował użytkownika po uwierzytelnieniu. Działa to, ponieważ na autoryzowanym żądaniu OAuth pobiera bieżącego użytkownika z tokenem autoryzacji. Nie musi mieć użytkownika w sesji.

Poniżej znajduje się plik config/initializers/doorkeeper.rb. Ostatnie dwie linie wylogowują się po autoryzacji.

# called for Resource Owner Password Credentials Grant 
    resource_owner_from_credentials do 
    request.params[:user] = {:email => request.params[:username], :password => request.params[:password]} 
    request.env["devise.allow_params_authentication"] = true 
    user = request.env["warden"].authenticate!(:scope => :user) 
    env['warden'].logout 
    user 
end 
+0

Jestem prawie pewien, że można to naprawić, instruując strażnika, aby nie zapisywał uwierzytelnionego użytkownika w sesji. 'user = request.env [ "strażnik"] uwierzytelnienia.! (Zakres:: użytkownik, sklep: false)' patrz: https://github.com/doorkeeper-gem/doorkeeper/issues/475 # issuecomment-305517549 – stevenharman

0

Gdybym cię poprawnie problem jest 1) Użytkownik przechodzi do aplikacji klienckiej, kliknięcia zalogować zastosowań 2) klient otrzymuje autoryzacji OAuth z serwerem. użytkownik jest pytany o nazwę użytkownika/hasło w tej chwili 3) użytkownik klika wylogowanie w aplikacji klienta 4) użytkownik klika ponownie logując się w aplikacji klienckiej, a następnie automatycznie loguje go przy użyciu starego tokenu uwierzytelnionego, zamiast ponownie pytać o nazwę użytkownika i pw, czego chcesz.

Jeśli to twój problem, ma to związek z plikami cookie. Sprawdź pliki cookie wysyłane w każdym żądaniu. W moim przypadku musiałem dodać linię

cookies.delete '_oauth_server_name_session'

i pracował wtedy. Możesz potwierdzić, że jest to problem związany z plikiem cookie, ponieważ po zmianie przeglądarki (lub przejściu do trybu incognito) tak się nie stanie.

Powiązane problemy