0

ユーザーが自分のFacebookアカウントでサインインすることに同意すると、アプリのコールバックがFacebookから呼び出されます。これは、Facebookがユーザーのメールを取得しなかったことに気づきましたが、omniauthの構成では、次のような権限リストにメールをリストしました。これ:

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook, omniauth_app_id, omniauth_app_secret_id,
           :scope => 'email,user_birthday,read_stream', :display => 'popup'
end

request.env['omniauth.auth']['extra']['raw_info']['email']またはでメールを見つけることを期待していますがrequest.env['omniauth.auth']['info']['raw_info']['email'] 、そこにはありません..実際、requestオブジェクト内のどの属性にもありません!

何か案が ?それは私のアプリのFacebook設定に関連していますか?

編集

Facebookからのコールバックの結果は次のとおりです。

puts auth.inspect

#<OmniAuth::AuthHash credentials=#<Hashie::Mash expires=true expires_at=1353164400 token="***"> extra=#<Hashie::Mash raw_info=#<Hashie::Mash first_name="***" id="***" last_name="***" link="***" locale="ar_AR" name="***" timezone=2 updated_time="2012-11-17T13:01:59+0000" username="***" verified=true>> info=#<OmniAuth::AuthHash::InfoHash first_name="***" image="***" last_name="***" name="***" nickname="***" urls=#<Hashie::Mash Facebook="***"> verified=true> provider="facebook" uid="***">

実際のデータを*に置き換えましたが、メールデータが欠落していることがわかります。

EDIT2

これがGemfilegem'devise'で使用されている私のgemです

gem 'omniauth'
gem 'omniauth-facebook', '1.4.0'

gem 'oauth2'
4

4 に答える 4

4

わかりました、見つけました!これがFacebookがここで言うことです

デフォルトでは、FB.loginを呼び出すと、基本的な権限のみでユーザーの認証が試みられます。1つ以上の追加のアクセス許可が必要な場合は、オプションオブジェクトを使用してFB.loginを呼び出し、ユーザーに要求するアクセス許可のコンマ区切りリストを使用してスコープパラメーターを設定します。

したがって、次のように「email」を追加する必要があります。

 FB.login(function(response) {
   // handle the response
 }, {scope: 'email,user_likes'});

助けてくれたすべての人に感謝します:-)

于 2012-12-03T01:32:43.350 に答える
2

メールを確認せずにFacebookアカウントを持っている可能性があります。この場合、にはキーrequest.env['omniauth.auth']['info']がありません。'email'

于 2014-01-29T13:47:46.600 に答える
1

infoハッシュから取得するのはどうですか?

request.env['omniauth.auth']['info']['email']

AuthHashセクションでomniauth-facebookが推奨するものだと思います

于 2012-11-17T05:25:13.203 に答える
1

Facebookにはdeviseとomniauthを使用します-次のrailscastに従います。適応できるかどうかはわかりませんが、メールやその他の情報を正常に取得できました。コールバックから。

http://asciicasts.com/episodes/241-simple-omniauth

コントローラのアクションは次のようになります(要約):

  def create  
    omniauth = request.env["omniauth.auth"]  
    authentication = Authentication.find_by_provider_and_uid(omniauth['provider'], omniauth['uid'])  
    if authentication  
      sign_in_and_redirect(:user, authentication.user)  
    elsif current_user  
      current_user.authentications.create(:provider => omniauth ['provider'], :uid => omniauth['uid'])  
      redirect_to authentications_url  
    else
      user = User.new
      user.apply_omniauth(omniauth)
      if user.save
        sign_in_and_redirect(:user, user)
      else   
        session[:omniauth] = omniauth.except('extra')
        redirect_to new_user_registration_url
       end
    end  
  end

User.apply_omniauth:

   def apply_omniauth(omniauth)  
     authentications.build(:provider => omniauth['provider'], :uid => omniauth['uid']) 
   end

他の誰かのアドバイスに従って、これを使用して電子メールを受け取ります。

 @omniauth_email = session[:omniauth][:info][:email]

これがお役に立てば幸いです。あなたが探しているものは静かではないことを私は知っています。

- 編集 -

私のイニシャライザーはあなたのものとは異なります。xsのものをすべて削除して、次のようなものを使用してみてください。

 Rails.application.config.middleware.use OmniAuth::Builder do  
  provider :facebook, 'xxxxxx', 'xxxxxx'  
 ...
 end
于 2012-11-17T17:22:03.297 に答える