LoginSignup
13
9

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-03-17

はじめに

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以上に上げることでも対応できます(修正コミット)。

13
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
9