2010-12-17 9 views
18

Tak, właśnie dostałem instalacji przy użyciu Rails 3, Devise i OmniAuth przez https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview.Devise i OmniAuth zapamiętywanie OAuth

mam pomyślnie uwierzytelnianie użytkowników za pomocą Facebooka, ale nie są one "rememberable" pomimo oznaczone:

devise [...]: rememberable, :omniauthable 

Próbowałem nazywając:

@the_user.remember_me! 

... bezskutecznie. Żadne pliki cookie nie są przechowywane/ustawiane, co oznacza, że ​​użytkownik nie utrzymuje się w sesjach.

Czy ktoś zdołał pobrać użytkownika z FB zapamiętanego za pośrednictwem plików cookie? Moim zdaniem powinno to nastąpić automatycznie.

Dziękuję za wszelkie pomysły lub opinie, które mogą Ci się spodobać.

Odpowiedz

11

Zgadzam się, że spodziewałbyś się, że Devise ustawi sesję, zanim zgłoszenie zostanie przesłane do FB. Domyślam się, że jest to brakująca funkcja Devise.

Sam miałem problem tam, gdzie użyłem tokena_autenticatable. Api klient dzwoni na poniższy link bezpośredni:

/users/auth/facebook?auth_token=TnMn7pjfADapMdsafOFIHKgJVgrBEbjKqrubwMXUca0n16m3Hzr7CnrP1s4z 

Ponieważ używałem token_authenticatable byłem zakładając byłoby podpisać w użytkownika. Niestety to nie działa po wyjęciu z pudełka. Aby to zrobić, musisz się upewnić, że użytkownik jest zalogowany, zanim dotrze do tej ścieżki. Możesz to zrobić na inne sposoby, ale najprościej jest podać inny adres URL do klienta API (w tym przypadku "users/connect/facebook" .To jest mój dodatek do pliku tras, który sprawia, że ​​działa (zakładając, że masz model użytkownik z opracowania i ty nie uległ zmianie domyślnych):

authenticate :user do 
    get 'users/connect/:network', :to => redirect("https://stackoverflow.com/users/auth/%{network}") 
end 

będzie to upewnij się, że sesja jest utworzony poprawnie, dzięki czemu użytkownik jest rozpoznawane, gdy on/ona wraca z Facebook

+0

W jaki sposób "dajesz" klientowi API inny adres URL? Gdzieś w config/initializers/devise.rb? –

19

ja”. Chciałbym rozwinąć (poprawną) odpowiedź @ jeroen-van-dijk podaną powyżej, która zadziałała dla mnie.

W config/routes.rb, dodaj nową trasę w devise_for Blok:

devise_for :users, :controllers => { 
        :omniauth_callbacks => "user_omniauth_callbacks" } do 
    ... 
    get '/users/connect/:network', :to => redirect("https://stackoverflow.com/users/auth/%{network}"), 
           :as => 'user_oauth_connect' 

end 

Następnie zmień link "Logowanie przy użyciu Facebooka", aby korzystać z nowej trasy:

<!-- before it linked to user_omniauth_authorize_path --> 
<%= link_to "Sign in using Facebook", user_oauth_connect_path(:facebook) %> 

w APP/controllers/user_omnniauth_callbacks_controller.rb

class UserOmniauthCallbacksController < Devise::OmniauthCallbacksController 
    include Devise::Controllers::Rememberable 

    def facebook 
    @user = User.find(...) 
    ... 
    remember_me(@user) # set the remember_me cookie 
    end 
end 

To rozwiązanie działa dobrze dla mnie przy użyciu Rails 3.1 i Devise 1.4.9.

+0

Przeoczyłem połączenie do remember_me na kontrolerze, a nie do modelu na początku. Nareszcie działało po włączeniu odpowiedniego modułu. –

+0

W Railsach 3.2.3 i Devise 2.1.2 wystarczyło dodać linię "include" i wywołanie "remember_me()". Nie musiałem zmieniać żadnego routingu. –

+0

@haraldmartin Próbowałem wszystkich rozwiązań, ale nie działają one dla mnie i otwieram nowe pytanie w następnym poście. Czy mógłbyś mi pomóc? Dzięki Fabrizio http://stackoverflow.com/questions/42280622/devise-omniauth-facebook-rememberable –

0

FYI - jeśli chcesz również użyć funkcji extend_remember_period w devise - trzeba wymusić to na obiekt użytkownika w sterowniku zwrotnej

dodaje jedną linię do użytkownika @ mustafaturan odpowiedź

user.remember_me = true 
user.extend_remember_period = true 

# then add your signing in code 
sign_in(:user, user) 
Powiązane problemy