2014-04-11 21 views
5

Facebook'a kaydolup/oturum açarak kullanıcıların oturum açmasına/oturum açmasına izin vermek için omniauth kullanıyorum! Ama Twitter ile bağlantı kurmaları için omniauth-twitter gem'i eklemek istedim. Şu URL'denRaylar: omniauth twitter ile çerez taşması

ActionDispatch::Cookies::CookieOverflow in OmniauthCallbacksController#twitter 

:

I/aşağıdaki hatayı alıyorum içinde kayıt olurken https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview

Ama:

ben bağlamak Facebook kurarken daha aynı adımları takip
http://localhost:3000/users/auth/twitter/callback?oauth_token=HRjON8J4bj9EcbjiELHcpHmSXo0cPd0wCHyuWG8ATZU&oauth_verifier=ZiZb1FAKZmNML1gVu5RKBLEGzbeAPPzC80QCpPDGU 

Ben farklı şeyler benzer yazılarda önerdi çalıştı ama bu çalıştı :(

hiçbiri

omniauth_callbacks_controller.rb => app/kontrolörleri/omniauth_callbacks_controller.rb

def twitter 
    # You need to implement the method below in your model (e.g. app/models/user.rb) 
    @user = User.find_for_twitter_oauth(request.env["omniauth.auth"]) 

    if @user.persisted? 
     sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated 
     set_flash_message(:notice, :success, :kind => "twitter") if is_navigational_format? 
    else 
     session["devise.twitter_data"] = request.env["omniauth.auth"] 
     redirect_to new_user_registration_url 
    end 
    end 

user.rb => app/modeller/user.rb

def self.find_for_twitter_oauth(auth) 
    where(auth.slice(:provider, :uid)).first_or_create do |user| 
    user.provider = auth.provider 
    user.uid = auth.uid 
    user.email = auth.info.email 
    user.password = Devise.friendly_token[0,20] 
    user.name = auth.info.name # assuming the user model has a name 
    end 
end 

def self.new_with_session(params, session) 
    super.tap do |user| 
     if data = session["devise.twitter_data"] && session["devise.twitter_data"]["extra"]["raw_info"] 
     user.email = data["email"] if user.email.blank? 
     end 
    end 
    end 
:İşte

benim yapılandırma

devise.rb => app/config/initializers/devise.rb

Rails.application.config.middleware.use OmniAuth::Builder do 
provider :twitter, "KEY, "KEYPASSWORD 
end 

Herhangi bir fikir yanlış mı?

+1

'request.env ["omniauth.auth"] 'seçeneğini büyük bir karmaşaya koydunuz. Daha fazla cevaba ihtiyacınız var? –

+0

Pro ipucu: İHTİYACINIZ parçaları kesin ve bunları oturuma yerleştirin. –

+0

Kod bilgim çok sınırlıydı, çünkü kodu aydan bir süre önce öğrenmeye başladım, bu yüzden şimdi bu karma şeyin ne anlama geldiğini anlamıyorum. Ben sadece koymak o benim facebook kimlik doğrulaması için omniauth modelim vardı ve o çalıştı - Ne demek istiyorsun kocaman bir karma? gereksiz mi? – zacchj

cevap

7

Michael'ın yorumlarda söylediği gibi, oturumda büyük bir karma saklıyorsunuz ve çok büyük (varsayılan CookieStore kullanıyorsunuz ve çerezler yalnızca 4 KB veri içerebilir). Omniauth tarafından sağlanan bu karma, twitter tarafından döndürülen tüm verilere sahiptir, ki bu oldukça fazla olabilir. Örneğin, bkz. README: https://github.com/arunagw/omniauth-twitter#authentication-hash

Sorunuzdaki kod, twitter oturum açma ile ilgili tüm kod ise, yalnızca oturumda e-postayı tutmanız gerektiği gibi görünüyor. new_with_session kodu. Yani twitter yılında else daki hat olan:

session["devise.twitter_data"] = request.env["omniauth.auth"] 

gibi bir şey olabilir:

session["devise.twitter_data"] = request.env["omniauth.auth"].select { |k, v| k == "email" } 

Ancak bununla büyük kusur olduğu twitter bir e-posta adresini döndürmediğini kullanıcı, bu nedenle veri ["email"] her zaman new_with_session içinde nil olacaktır! Bu nedenle, daha sonra hiçbir zaman twitter tarafından iade edilmeyen e-postayla ilgileniyorsanız, oturumda hiçbir şey tutmazsınız. Belki de bunun yerine e-posta adresi yerine kayıt formunu doldurmak için bir isim almak istersiniz. Bu durumda, onu omniauth'dan koruyabilirsin. Her şeyi yardımcı olabilir "ekstra" iç içe karma kaldıracaktır

session["devise.twitter_data"] = request.env["omniauth.auth"].delete_if("extra") 

: Eğer karma bir kaç yürümesini istiyoruz, o zaman bunun yerine onları seçerek tüm gibi bir şey yapabileceğini, oturumda koymak başka oturuma sığdırmak için.

Tam bir çözüm için Facebook ile giriş yapan kişilerle uğraşmak gibi zor durumları düşünmeniz ve ardından Twitter ile giriş yapıp aynı e-posta adresini kullanmak ve mevcut hesabınızla birleştirmek zorunda kalacaksınız. sistemi.

Her durumda, Rails 3 kullanıyorsanız, oturum çerezinin şifrelenmediğini unutmayın, böylece kullanıcı veya bilgisayarına erişimi olan herkes, çerezin içeriğini okuyup her hangi bir veriden okuyabiliyorsa, sonuçta siz de Orada. Rails 4 kullanıyorsanız, buna karşı korumak için çerez şifreli olmalıdır.