Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Facebook APIのバージョンを2.2から2.3へ上げる時の落とし穴

More than 3 years have passed since last update.

はじめに

FacebookのAPIは定期的に古いバージョンのAPIが使用不可になると共に、APIのバージョンが強制的にアップグレードされます。その際には事前にFacebookより「(アプリ名)の新しい開発者アラート」というメールが届き、いついつまでにバージョンを上げろ(上げないと勝手に上げるよ)という指令が届きます。

例えば2017/02/28には「2017/03/27までにAPIのバージョンを2.3以上にしなさい」というメールが、Facebookより配信されました。

ここでは具体例として、omniauth-facebookを使っている際(Deviseと併用している時含む)、使用するFacebook APIのバージョンを2.3以上にする時に必要なことを説明します。

その他のライブラリを使っている方は「落とし穴の説明」をご覧になって、自前で対応いただけると幸いです ( _ _)

落とし穴の説明

結論としてはFacebook APIの仕様がバージョン2.3未満と2.3以上で異なり、2.3以上ではアクセストークンAPIのレスポンスフォーマットが異なるので、受け側もそれに対処しなければならないという問題です。レスポンスがJSONで返ってくるようになってるので、パースしてトークンを取り出してあげる必要があります。

Facebook公式の該当Change Logは以下になります。

[OAuthアクセストークン]フォーマット - access_tokenのコードを交換した際に返されるhttps://www.facebook.com/v2.3/oauth/access_token の応答フォーマットが、URLエンコードされるのではなく、有効なJSONを返すようになりました。 この応答の新しいフォーマットは、{"access_token": {TOKEN}, "token_type":{TYPE}, "expires_in":{TIME}}です。RFC 6749のセクション5.1に準拠するために、このアップデートを行いました。

Upgrade Guideは以下。

Manually Build a Login Flow
If you build your own Login flow, there is an update to the OAuth code exchange that now conforms to the latest OAuth RFC spec. See details in the changelog entry, see Facebook Platform Changelog, API version 2.3.

2.2以下にしか対応していないライブラリでこの問題に遭遇すると、例えば以下のようなエラーが出力されることがあります。返ってきたレスポンスであるJSONを丸々トークンとして使おうとしているので、invalid credentialsエラーが出ています。

E, [2017-03-17T14:37:04.698743 #71992] ERROR -- omniauth: (facebook) Authentication failure! invalid_credentials: OAuth2::Error, :{"access_token":"xxx","token_type":"bearer","expires_in":000}

対応の具体例

APIのバージョンを現在(2017/03/17)の最新である2.8に上げる場合を説明します。ポイントはどちらもtoken_params: { parse: :json }です。以下はomniauth-facebookを使っている場合です。

Deviseと併用している場合

config/initializers/devise.rb
  config.omniauth :facebook, ENV['APP_ID'], ENV['APP_SECRET'], image_size: :large,
    client_options: {
      site: 'https://graph.facebook.com/v2.8',
      authorize_url: "https://www.facebook.com/v2.8/dialog/oauth"
    },
    token_params: { parse: :json },
    info_fields: 'name,email' # 取得情報がバージョンアップに伴い絞られているので、必要な場合はこちらも

omniauth-facebook単体の場合

use OmniAuth::Builder do
  provider :facebook, ENV['APP_ID'], ENV['APP_SECRET'],
    client_options: {
      site: 'https://graph.facebook.com/v2.8',
      authorize_url: "https://www.facebook.com/v2.8/dialog/oauth"
    },
    token_params: { parse: :json },
    info_fields: 'name,email' # 取得情報がバージョンアップに伴い絞られているので、必要な場合はこちらも
end

もしくは、omniauth-facebook gemのバージョンを4.0.0以上に上げることでも対応できます(修正コミット)。

anoworl
appbrew-inc
「ユーザーが熱狂するプロダクトを再現性をもって創造する」をミッションにサービス開発・運営を行うスタートアップ
https://lipscosme.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away