9

新しい Rails アプリを作成し、Devise と omniauth-facebook gem をインストールしました。

そして、私の Facebook アプリをテスト環境として設定します。

そこで、facebook 経由でログインし、新しい Rails アプリにサインアップしましたが、request.env に email address.info が含まれていませんでした。

これが返されます request.env['omniauth.auth']

{
   "provider" => "facebook",
   "uid" => "xxxxxxxxxxxx",
   "info" => {
         "name" => "xxxxxxx",
        "image" => "http://graph.facebook.com/xxx/picture"
    },
    "credentials" => {
             "token" => "tokenstring",
        "expires_at" => xxxxxxxxx,
           "expires" => true
    },
          "extra" => {
        "raw_info" => {
            "name" => "xxx xxxx",
              "id" => "xxxxxxxxx"
        }
    }
}

それは request.env['omniauth.auth']['info']['email'] をラックします

oauth経由でFacebookからメールアドレスを取得するにはどうすればよいですか? 誰か助けてください。

Rails バージョンは 4.2.3 Ruby バージョンは 2.2.2p95

これは Gem バージョンです

 omniauth (1.2.2)
 omniauth-facebook (2.0.1)
 devise (3.5.1)

config/initializers/devise.rb

  config.omniauth :facebook, 'appId', 'appSeacret', scope: 'email,public_profile'

app/controllers/omniauth_callbacks_controller.rb

  def all_provider
    user = User.from_omniauth(request.env['omniauth.auth'])
    if user.persisted?
      sign_in_and_redirect user
    else
      session['devise.user_attributes'] = user.attributes
      redirect_to new_user_registration_url
    end
  end

  alias_method :facebook, :all_provider

アプリ/モデル/user.rb

def from_omniauth(auth)
  where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
    user.email = auth.info.email
  end
end

2015/7/11追記

古いテスト Facebook アプリケーションで同じコードを再試行したところ、完全な public_profile と電子メールを取得できました。

新しいFacebookアプリに何か制限が追加されますか?? 誰か知ってる?

4

1 に答える 1

15

自分でメールアドレスを取得する方法を見つけました。

https://developers.facebook.com/docs/apps/changelog#v2_4

このドキュメントはそれを言います

宣言型フィールド モバイル ネットワークでのパフォーマンスを向上させるために、v2.4 のノードとエッジでは、GET 要求に必要なフィールドを明示的に要求する必要があります。たとえば、GET /v2.4/me/feed には既定でいいね! とコメントが含まれなくなりましたが、GET /v2.4/me/feed?fields=comments,likes はデータを返します。詳細については、特定のフィールドをリクエストする方法に関するドキュメントを参照してください。

そのため、config/initializers/devise.rb に書き込む必要があります。

  config.omniauth :facebook, 'app_id', 'app_secret',  scope: 'email', info_fields: 'email'
  • scope: 'email'デフォルトです

スコープだけでなく、info_fields も含まれます。

于 2015-07-12T05:16:19.483 に答える