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?

HybridAuth(Facebook PHP SDK v3.2.2)でFacebookログインができなくなる問題に対処

More than 3 years have passed since last update.

課題

3/28より、FacebookのID連携をしているサービスで急にログインができなくなった。
ID連携には、HybridAuthというPHPのOAuthのライブラリを使っている。

原因

Facebook API ver2.2まではアクセストークンがクエリ文字列で access_token=xxx みたいに返ってきていた。
3/28のAPIアップデートにより、ver2.2が廃止され、ver2.3が最低バージョンになった。ver2.3以降は、戻り値がクエリ文字列ではなく、JSONになったのが原因。アクセストークンを取り出せずエラーになってしまう。
(参考) https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow

response.json
{
  "access_token": {access-token}, 
  "token_type": {type},
  "expires_in":  {seconds-til-expiration}
}

対処

APIバージョンを指定

エンドポイントの最後に /v2.8 のようにバージョンを指定。
これをしないと、呼び出しでバージョンを指定しないと、利用できる最も古いバージョンにデフォルトが設定されるということで、予期しない動作をする可能性があるので。

base_facebook.php
  /**
   * Maps aliases to Facebook domains.
   */
  public static $DOMAIN_MAP = array(
    'api'         => 'https://api.facebook.com/v2.8/',
    'api_video'   => 'https://api-video.facebook.com/v2.8/',
    'api_read'    => 'https://api-read.facebook.com/v2.8/',
    'graph'       => 'https://graph.facebook.com/v2.8/',
    'graph_video' => 'https://graph-video.facebook.com/v2.8/',
    'www'         => 'https://www.facebook.com/v2.8/',
  );

アクセストークンをJSONとしてパース

Facebook SDKの、getAccessTokenFromCode という関数の中身で、レスポンスをJSONでパースするように変更

(変更前)base_facebook.php
    $response_params = array();
    parse_str($access_token_response, $response_params);
    if (!isset($response_params['access_token'])) {
      return false;
    }

    return $response_params['access_token'];

(変更後)base_facebook.php
    $response_params = array();
    $response_params = json_decode($access_token_response);
    if (!isset($response_params->access_token)) {
      return false;
    }

    return $response_params->access_token;

参考

http://qiita.com/acro5piano/items/514a7dc0e34e067235ad

hosikiti
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