私はこの問題を自分で見つけました。これは、SDK 3.2.2のためです。 (APIバージョン2.3用Changelogから)Facebookの更新の場合:
[のOauthアクセストークン]フォーマット - あなたが今access_tokenはのためのコードを交換する代わりに、URLエンコードされているのに有効なJSONを返すときhttps://www.facebook.com/v2.3/oauth/access_tokenの応答形式が返されます。この応答の新しいフォーマットは{"access_token":{TOKEN}、 "token_type":{TYPE}、 "expires_in":{TIME}}です。私たちは、
6749. RFCのセクション5.1に準拠するように、このアップデートをしたが、SDKには、(getAccessTokenFromCode関数の)配列として応答を認識している:
$response_params = array();
parse_str($access_token_response, $response_params);
if (!isset($response_params['access_token'])) {
return false;
}
return $response_params['access_token'];
これは、ユーザーのアクセストークンを取得することはありません正しく、ユーザーのデータを取得することはできません。したがって、この関数を更新してデータをjsonとして解析する必要があります。
$response = json_decode($access_token_response);
if (!isset($response->access_token)) {
return false;
}
return $response->access_token;
すべての関数は通常通り動作します。
さらに、setExtendedAccessToken()
に同様の変更を加える必要があります。そうしないと、アプリケーションはアクセストークンを拡張できなくなります。次のコードは、この関数をアップグレードする方法を示しています。
/**
* Extend an access token, while removing the short-lived token that might
* have been generated via client-side flow. Thanks to http://bit.ly/ b0Pt0H
* for the workaround.
*/
public function setExtendedAccessToken() {
try {
// need to circumvent json_decode by calling _oauthRequest
// directly, since response isn't JSON format.
$access_token_response = $this->_oauthRequest(
$this->getUrl('graph', '/oauth/access_token'),
$params = array(
'client_id' => $this->getAppId(),
'client_secret' => $this->getAppSecret(),
'grant_type' => 'fb_exchange_token',
'fb_exchange_token' => $this->getAccessToken(),
)
);
}
catch (FacebookApiException $e) {
// most likely that user very recently revoked authorization.
// In any event, we don't have an access token, so say so.
return false;
}
if (empty($access_token_response)) {
return false;
}
//Version 2.2 and down (Deprecated). For more info, see http://stackoverflow.com/a/43016312/114558
// $response_params = array();
// parse_str($access_token_response, $response_params);
//
// if (!isset($response_params['access_token'])) {
// return false;
// }
//
// $this->destroySession();
//
// $this->setPersistentData(
// 'access_token', $response_params['access_token']
//);
//Version 2.3 and up.
$response = json_decode($access_token_response);
if (!isset($response->access_token)) {
return false;
}
$this->destroySession();
$this->setPersistentData(
'access_token', $response->access_token
);
}
v2.3では、まだすべてのフィールドを取得する必要があります。しかし、v2.4から、必要なフィールドを明示的に求めなければなりません。http://stackoverflow.com/a/32585470/1427878 – CBroe
@CBroeありがとう、後で気付くでしょう:) –
私はこの問題のために、「アクティブなアクセストークンを使用して現在のユーザーに関する情報を照会する必要があります」というエラーメッセージが表示されました。 – rinogo