4

私はこのコードを持っています:

$facebook->api("/oauth/access_token?grant_type=fb_exchange_token&client_id=".$facebook->getAppId()."&client_secret=".$facebook->getAppSecret()."&fb_exchange_token=".$user->getFacebookAccessToken());

例外はスローしませんが、null を返します。有効期間の短い Facebook ユーザー アクセス トークンを有効期間の長い Facebook ユーザー アクセス トークンに拡張しようとしています。ただし、新しいトークンを生成し、新しいトークンがまだ生きている間にこのリクエストを呼び出した後、数時間待って、Facebook アカウントでログインしていないブラウザを起動しました。次に、テスト ユーザーで (Facebook ではなくアプリケーションに) ログインしましたが、残念ながら Facebook ログインに誘導されました。これは、Facebook ユーザー アクセス トークンが何らかの理由で無効になったことを意味します。

ここにあるドキュメントに基づいて作業していました。

では、Facebook が実際にトークンのライフ サイクルを延長できるようにするには、どのようにリクエストを送信すればよいか教えてもらえますか? また、Facebook ユーザー アクセス トークンのライフ サイクルが正常に延長されたかどうかを判断する方法がわかりません。(控えめに言っても、私は Facebook のファンではなく、Facebook API も初めてです)。

みんなありがとう。

編集:この記事を読んで、 setExtendedAccessToken メソッドをクラスにコピーし、ロジックをサポートするためにいくつかの変更を加えました。ユーザー Facebook アクセス トークンのライフサイクルを延長しようとするコードは次のとおりです。

$facebook->setExtendedAccessToken($user->getFacebookAccessToken());

これで、トークンと有効期限の 2 つの要素の配列が返されます。有効期限は「5174078」です。私はこの問題を解決するために正しい方向に進んでいると信じていますよね?

4

2 に答える 2

4

あなたがすべきことは次のとおりです。

  1. ログインした FB ユーザーがサイトにアクセスすると、Javascript SDK のクライアント側フローを介して短命トークンを取得するか、PHP またはその他の SDK を使用したサーバー側フローを介して長期トークンを取得します(あなたはすでにこれらの最初のことをしているようです)
  2. 有効期間が短いトークンの場合は、それを拡張し、トークンを交換する API 呼び出しを介して有効期間が長いトークンを取得します(これも行っているようです)。
  3. 長期間有効なトークンをデータベースに保存します(これを行っているかどうかはわかりません)。
  4. ユーザーが別の時点でアプリに戻ってきて、独自のログイン システムを介してアプリにログインしているが、Facebook にログインしていない場合、->setAccessToken() でデータベースからキャッシュされたトークンを使用してから、呼び出しを行います。彼らに代わってFacebook APIに

ステップ4があなたの問題だと思います。ユーザーが Facebook からログアウトし、独自のログイン メカニズムを介してアプリにログインさせ、以前に保存したトークンを再利用するのではなく、Facebook 認証プロセスを介して再度送信していると思われます。

これは完全に問題ありませんが、その場合、トークンを保存する必要はありません。これをすべて「ライブ」で実行し、ユーザーが引き続き Facebook にログインして、新しいトークンをキャッシュする代わりに「ライブ」でフェッチするように要求できます。アプリへの前回のアクセスで取得したトークン。

于 2013-07-16T15:43:57.753 に答える