8

私は拡張された長寿命のアクセストークンを取得しようとします

$facebook->setExtendedAccessToken();
$access_token = $facebook->getAccessToken();

SDKを調べたところ、setExtendedAccessToken()関数が有効期間の長いアクセストークンを設定していることがわかりました。

protected static $kSupportedKeys =
array('state', 'code', 'access_token', 'user_id');

$this->setPersistentData(
  'access_token', $response_params['access_token']
);

getAccessToken()は、からの短期間のアクセストークンを返します。

protected $accessToken

では、setExtendedAccessToken()は何も返さないので、その目的は何ですか?

4

2 に答える 2

12

@ジュリアン。ここにたくさんの感動をありがとう。コア FB api ファイルを変更せずに、これを機能させることができました。

何が起こるかというと、setExtendedAccessToken呼び出しは に値を送信し、setPersistentDataそれを 経由でセッションに送信しconstructSessionVariableNameます。

したがって、それをセッションから取り出して facebook オブジェクトに設定すれば、準備は完了です。

これが私のコードです:

// ask for the extended token and get it from session ...
$facebook->setExtendedAccessToken();
$access_token = $_SESSION["fb_".FB_APP_ID."_access_token"];
// now set it into the facebook object ....
$facebook->setAccessToken($access_token);
// now our fb object will use the new token as usual ...
$accessToken = $facebook->getAccessToken();
于 2012-11-05T00:19:57.440 に答える
5

さらに調べてbase_facebook.phpみたところ、次のことがわかりました。

  • setExtendedAccessToken();有効期間の短いアクセス トークンを交換し、Facebookは適切な拡張アクセス トークンを返します。
  • setExtendedAccessToken();はこれを永続データ キャッシュに保存しますが、永続キャッシュにクエリを実行しないgetAccessToken();ため、アクセスできるわけではありません。getAccessToken();さらに、このクラスは永続データを「フェイルセーフ」として扱っているようで、他のすべてのデータ取得の試みが失敗した場合 (つまり、 をチェックsigned_requestして を解析した後code) にのみそれを使用します。
  • 私たちの場合、経由で返されたアクセス トークンはsetExtendedAccessToken();最新のアクセス トークンであるため、ハッキングして修正しました。の一番下に次の行を追加します。setExtendedAccessToken();

    // Also set the publically accessible access token value to this new extended token

    $this->accessToken = $response_params['access_token'];

  • 警告: 新しい拡張アクセス トークンが得られたとしても、アクセス トークンを取得するための Facebook への後続のクエリ (ページの更新後など) は、同じ古い有効期間の短いアクセス トークンを返します。*フェイスパーム*

  • ユーザーがログアウトした後でも (これにより短命のトークンが期限切れになります)、再度ログインしても、Facebook は再び短命のアクセス トークンを返します。
  • ただし、この場合でも、 はsetExtendedAccessToken();以前に取得したものと同じ拡張アクセス トークンを返します。このトークンは、引き続きユーザー情報のクエリに使用できます。

つまり、これは Facebook のバグのように見えます。上記で詳しく説明したハックを使用してこれを回避できます。アクセス トークンを取得するための後続の呼び出しは、有効期間が短いアクセス トークンを返すだけで、同じ拡張アクセス トークンと何度も交換できます。


元の回答

この回答によると、新しいアクセス トークンは永続データに保存され (質問にも示されているように)、 経由でアクセスできます$facebook->getAccessToken();

関連する 2 つの注意事項:

  • このページでは、有効期間が短いアクセス トークンが拡張アクセス トークンと交換されると、トークン自体が変更される場合と変更されない場合があることにも言及していますが、有効期限は長い有効期限を反映するように更新されているはずです。を呼び出すと$facebook->getAccessToken();、単に同じトークンが返されるだけで、有効期限が変更されたのではないでしょうか?
  • 有効期間の短いアクセス トークンを有効期間の長いアクセス トークンに交換するための呼び出しは、ユーザーごとに 1 日に 1 回のみ行うことができます。これがなぜなのかはわかりません。また、ユーザーがアプリの認証を解除して再認証することを決定した場合に、このカウンターがリセットされるかどうかもわかりません。

Facebookのドキュメントから:

ユーザーが既存の有効な有効期間の短いユーザー access_token を使用してサイトにアクセスした場合、そのアクセス トークンの有効期限を延長するオプションがあります。当社のプラットフォームは 1 日に 1 回のみ有効期限を延長します。そのため、ユーザーが 1 日に複数回サイトを再表示した場合でも、トークンは最初に要求されたときに延長されます。(私のものを強調)

ずさんなプログラマーは$facebook->setExtendedAccessToken();、常に拡張アクセス トークンを取得することを期待して、あらゆる機会に呼び出しを行うため、これが当てはまると思います。(現在持っているものが短命のアクセストークンである場合にのみ呼び出すという好ましい動作の代わりに-しかし、有効期限を保存していない限り、どうすればそれを知ることができますか。それ自体はそうではありません$facebook->setExtendedAccessToken();信頼性のある...!)

ユーザーがアプリの認証を解除するか、トークンが無効になると、制限がリセットされ、有効期間の短いアクセス トークンを渡すときに、拡張アクセス トークンをもう一度取得できるようになると思います。ただし、これにはさらにテストが必要なため、この段落は慎重に検討してください。

于 2012-09-28T13:23:25.523 に答える