TIESのブログ

Facebook API v2.2 の使用期限が切れました

Facebook API v2.2 の使用期限が切れましたね。
https://developers.facebook.com/docs/apps/changelog
TIESではちょうど v2.2 辺りに Facebook アプリをよく作成していましたので、それぞれアップグレード対応が必要でした。

API Upgrade Toolで確認してね、と通知が来ていたので確認した所、特に問題なさそうなので対応していった所、
CHiLOサイトのOAuth認証で問題が出ました。

エラーが出てログインできません

CHiLOサイトでは、公開している OAuth 認証が出来るプラグインのうちの1つを使用しており、
そのうち、Google と Facebook の OAuth 認証を有効にしているのですが、そのうち、Facebookの方だけログインできなくなりました。
作成者様曰く、 Moodle 3.3 からは コアに OAuth 認証が実装されるらしいしもう新しいバージョンは作らない的なことらしいです。

コアに OAuth 認証が実装されるのでしたら、そちらにアカウントの引っ越し作業すべきかとも思ったのですが、Moodle 3.3 はまだ正式版出ていないので本番環境で使うのは怖いですね。
ただ、コアで実装されるらしいのに、今の時点で別プラグインに引っ越すのもタイミングが悪いなぁってことで、とりあえず延命措置として今のプラグインでもFacebookのアカウントでログインできるようにソースを少しいじってみました。

エラーを見ると

Required option not passed access_token Array

と出ていたのでそれで探したら、同じ問題のことが書かれていたページがありました。
https://github.com/thephpleague/oauth2-facebook/issues/1
v2.3 から受け取る情報の形がJSONに変わっているらしいです。

本当ですね
https://developers.facebook.com/docs/apps/changelog#v2_3
> [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に準拠するために、このアップデートを行いました。

とりあえず一時措置として、取得したJSONデータをばらしてaccess_tokenを取得すれば動くようなことを言っいるらしいので、こちらもそれにあやかって同じように変更しました。

/vendor/league/oauth2-client/src/Provider/Facebook.php
--- const DEFAULT_GRAPH_VERSION = 'v2.2';
+++ const DEFAULT_GRAPH_VERSION = 'v2.7';

/vendor/league/oauth2-client/src/Provider/AbstractProvider.php
--- return $grant->handleResponse($result);
+++ $result = array_keys($result);
+++ return $grant->handleResponse(json_decode($result[0], true));

変更後、Facebook でログインできるようになりました!(*^-^*)

と思ったら Google でログインできなくなりました!(´゚д゚`)

ということで、Facebook の時だけ処理されるように微修正...

/vendor/league/oauth2-client/src/Provider/AbstractProvider.php
+++ if($this->name == 'facebook'){
        $result = array_keys($result);
        return $grant->handleResponse(json_decode($result[0], true));
+++ }else{
+++     return $grant->handleResponse($result);
+++ }

とりあえずこれで Google と Facebook 両方ログインできました。本番環境にも適応させてみて、今の時点でですが、特に問題なく動いています。
一応、Facebook API 2.7 までは動いたので、しばらくはこれで誤魔化せそうですね。(API 2.8ではこの対応だとエラー出た)

---

と、対応してみたものの、facebook と google しか動作見てないので、他はどうかわからないですし、ちゃんとした修正版が出るようでしたら、そちらの方を適応した方が良いですね。

Facebook API v2.2 の使用期限が切れました はコメントを受け付けていません