考えすぎてしまう人のブログ

いつも考えすぎてしまう僕の脳内を垂れ流します

【2017/7/19】omniauth + omniauth-facebook でメールアドレスだけでなく性別や誕生日などのデータをついでに取得する方法【API v 2.x】

FacebookAPIもどんどんアップデートされているので最近では「デフォルトではemailが取れない」だとか色々な混乱を耳にします

ネットを明後日も古い記事だったり新しい記事だったりが混在しているので動いたり動かなかったり難しい状況です

そこで現段階で確実に動くものを置いておきます

omniauthの設定ファイルに記入する

# /config/initilize/omniauth.rb

facebook_scopes = [
  :email,                     # メールアドレスを取得
  :public_profile,            # 公開プロフィール
  :user_about_me,             # プロフィールの「自己紹介」を取得
  #:user_hometown,             # ユーザーの地元を取得
  #:user_location,             # ユーザーの居住地を取得
  #:user_website,              # ユーザーのHPのURLを取得
  :user_birthday,             # ユーザーの誕生日を取得
  #:user_work_history,         # 職歴にアクセスする
  #:user_education_history,    # 学歴にアクセスする
]
facebook_infos = [
  :email,
  :birthday,
  :gender,
  :first_name,
  :last_name,
  :picture,
]
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook,
            ENV['FACEBOOK_KEY'],
            ENV['FACEBOOK_SECRET'],
            scope: facebook_scopes.join(','),
            info_fields: facebook_infos.join(',')

  # 認証キャンセル、戻るボタンからの遷移の際に/auth/failureにリダイレクト
  on_failure do |env|
    OmniAuth::FailureEndpoint.new(env).redirect_to_failure
  end
end

こんな感じです

データを取得するには?

def callback
  auth = request.env["omniauth.auth"]
  user.first_name = auth.extra.raw_info.first_name
  user.last_name = auth.extra.raw_info.last_name
  user.gender = auth.extra.raw_info.gender
end

こんな感じでauth.extra.raw_info....に保存されていますのであとは煮るなり焼くなり好きに使いましょう

注意

本番環境でbirthdayとか取得したい場合は多分Facebookに申請が必要です

「俺さ、こんなアプリ作って、誕生日とかのデータほしいんだけど許可くれない?」

ってお伺いをたてて、OKを貰わないと使えません

開発環境(非公開モード)ではわりと自由にとれるので本番に移動したら動かない!みたいな問題が発生したときはこれを疑って下さい

参考

qiita.com

このqiitaの投稿が参考になりました

thank you :)