2010-12-17 11 views
18

Bu yüzden, https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview aracılığıyla Rails 3, Devise ve OmniAuth kullanarak kurulum yaptım.Devreye alma ve OmniAuth OAuth'u hatırlama

başarıyla Facebook üzerinden kullanıcıların kimliklerini doğrulamaktadır ediyorum, ama onlar ile işaretlenmiş olmasına rağmen "rememberable" değildir:

devise [...]: rememberable, :omniauthable 

Aramaya çalıştım:

@the_user.remember_me! 

... boşuna. Hiçbir çerez saklanır/set edilmez, bu da kullanıcının oturumlar boyunca devam etmediği anlamına gelir.

Çerezlerle hatırlanan FB'den bir kullanıcı almayı başarabilen biri var mı? Aklımda, bu otomatik olarak gerçekleşmelidir.

Sizin için olabilecek herhangi bir fikir veya geri bildiriminiz için teşekkür ederiz.

cevap

11

İstek isteğinin FB'ye gitmeden önce bir oturum açmasını bekleyeceğinizi kabul ediyorum. Sanırım bu Devise'nin eksik bir özelliği.

Ben kendimi token_authenticatable kullandığım yerde sorun yaşadım. Bir API istemcisi doğrudan aşağıdaki url çağırıyordu:

/users/auth/facebook?auth_token=TnMn7pjfADapMdsafOFIHKgJVgrBEbjKqrubwMXUca0n16m3Hzr7CnrP1s4z 

Ben kullanıcıyla oturum ediyorum bu üstlendiğini token_authenticatable kullanıyordum beri. Ne yazık ki bu kutudan çıkmıyor. Bu çalışmayı elde etmek için yapmanız gereken, kullanıcının bu yola girmeden önce oturum açtığından emin olmaktır. Bunu başka yollarla da yapabilirsiniz, ancak en kolay yol API istemcisine farklı bir url vermektir (bu durumda "users/connect/facebook".) Çalıştığınız rota dosyasına eklediğim adımdır. Eğer varsayılan değişmedi ve bir cihazla birlikte bir kullanıcı modeli): o/o facebook dönüşünde kullanıcı kabul ediliyor böylece

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

Bu emin oturumu doğru oluşturulur yapacaktır Ben

+0

API istemcisini başka bir URL'ye "nasıl" verirsiniz? Config/initializers/devise.rb içinde bir yerde mi? –

19

. d üzerinde çalıştığı gibi (doğru) cevap @ jeroen-van-dijk üzerinde çalışmayı severim.

config/routes.rb'de devise_for için yeni bir rota ekleyin Blok:/kontrolörleri/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 

Bu çözüm işe yarar uygulamasında

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

:

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 

Ardından yeni rotayı kullanmak üzere "login facebook kullanarak" bağlantısını değiştirmek Rails 3.1 ve Devise 1.4.9 kullanarak benim için.

+0

İlk başta modelden ziyade kontrol ünitesindeki remember_me çağrısını kaçırdım. Sonunda doğru modülü dahil ettikten sonra çalıştım. –

+0

Rails 3.2.3 ve Devise 2.1.2'de "include" satırının eklenmesi ve "remember_me()" çağrısı yeterliydi. Yönlendirmeyi değiştirmek zorunda değildim. –

+0

@haraldmartin Tüm çözümleri denedim, ancak benim için çalışmazlar ve şu yazıya yeni bir soru açıyorum. Lütfen bana yardım eder misiniz? Teşekkürler Fabrizio http://stackoverflow.com/questions/42280622/devise-omniauth-facebook-rememberable –

0

Bilginize - Ayrıca vasiyetle extend_remember_period özelliğini kullanmak istiyorsanız - Eğer bu zorlamak gerekiyor

geri arama kontrol kullanıcı nesne @ mustafaturan cevabı bir satır ilave

user.remember_me = true 
user.extend_remember_period = true 

# then add your signing in code 
sign_in(:user, user) 
İlgili konular