15

基本的な問題:ユーザーが不在の場合でも、許可されたユーザーについてFacebookグラフAPIをアプリで呼び出せるようにしたい。

たとえば、ユーザー(A)にアプリを承認してもらい、後でユーザー(B)がアプリを使用してユーザー(A)の友達に関する情報を表示できるようにします。具体的には、「作業」フィールド。はい、これらの拡張アクセス許可(、、など)を要求していuser_work_historyますfriends_work_history現在、私のアプリは、ログインしているユーザーの友達の作業履歴にアクセスできますが、アプリの他のユーザーの友達の作業履歴にはアクセスできません。

これが私がすでに知っていることです:

  • スコープパラメータへの追加offline_accessは古い方法であり、機能しなくなりました。
  • 新しい方法は、「長寿命」のアクセストークンを使用することです。ここ。これらは60日間続きます。
  • 新しい拡張トークンを取得するには、通常のアクセストークンを交換する必要があります。FBのドキュメントには次のように書かれています。

    https://graph.facebook.com/oauth/access_token
    client_id = APP_ID&client_secret = APP_SECRET&grant_type = fb_exchange_token&fb_exchange_token = EXISTING_ACCESS_TOKEN

これが私が知らないことです(そしてあなたが私に教えてくれることを願っています): Facebook PHP SDKを使用して拡張(別名「長寿命」)アクセストークンを取得するにはどうすればよいですか?現在、私のコードは次のようになっています。

$facebook->getAccessToken();

このようなものはありますか?:

$facebook->getExtendedAccessToken();

そうでない場合、これは私がすべきことですか?

$accessToken = $facebook->getAccessToken();
$extendedAccessToken = file_get_contents("https://graph.facebook.com/oauth/access_token?             
    client_id={$appId}&
    client_secret={$secret}&
    grant_type=fb_exchange_token&
    fb_exchange_token={$accessToken}"
    );

試しましたが、うまくいきません。このエラーが発生します:

Warning: file_get_contents(https://graph.facebook.com/oauth/access_token? client_id=#######& client_secret=#########& grant_type=fb_exchange_token& fb_exchange_token=##########) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request in /...

グラフAPIの代わりにFQLに切り替えると、動作が異なりますか?Facebookのドキュメントを何度も読んだことがありますが、PHP sdkは完全にドキュメント化されておらず、これがどのように機能するかの例を見つけることができません。

4

4 に答える 4

29

私はついにこれを自分で理解しました。答えはかなり反気候的です。新しく作成されたアプリは、60日間のアクセストークンを自動的に取得するようです。これが、アプリ設定の[移行]セクションで[depricateoffline_access]設定を有効にすることに依存しているかどうかはわかりません。安全のためにそのままにしておきます。

したがって、これを書いている時点では、次のようにPHPSDKを使用できます。$facebook->getAccessToken();

(私のアプリが期待どおりに機能しなかった理由は、アクセストークンの有効期限とは関係ありませんでした。)

もう1つ、PHP SDKを使用して長期間有効なアクセストークンを取得するには、$facebook->setExtendedAccessToken();前に呼び出す必要があります$facebook->getAccessToken();

于 2012-06-06T20:22:39.333 に答える
22

前回のFacebookPHPSDK 3.2.0には、setExtendedAccessToken() 前に呼び出す必要のある新しい関数がありますgetAccessToken();

このような:

$user = $facebook->getUser(); 
$facebook->setExtendedAccessToken(); //long-live access_token 60 days
$access_token = $facebook->getAccessToken();
于 2012-08-20T19:24:48.273 に答える
12

実際に新しく作成されたアプリは、サーバー側の呼び出しを使用している場合、60日間のアクセストークンのみを自動的に取得します。上記の質問で示したようにクライアント側のエンドポイントを使用している場合、新しいアプリでも最初は短期トークンを受け取ります。参照:https ://developers.facebook.com/docs/roadmap/completed-changes/offline-access-removal/

新しいエンドポイントを使用したときに発生したのと同じHTTP/1.1 400 Bad Requestエラーが発生しました。問題は、Facebookから提供されたコードを正確にコピーしてアプリに貼り付けると、パラメーターの間に実際にはスペースがあることを意味します。 URLに不要なスペースがあり、file_get_contents()に渡されると、ブラウザに貼り付けても問題なく機能しますが、正しく呼び出されません。これは私が理解するのに時間がかかりすぎました。これが誰かに役立つことを願っています!新しいエンドポイントから拡張アクセストークンを取得するための完全に機能するコードは次のとおりです(xを値に置き換えます)。

$extend_url = "https://graph.facebook.com/oauth/access_token?client_id=xxxxxxxxxxxx&client_secret=xxxxxxxxxxxxxxxxxxxxxx&grant_type=fb_exchange_token&fb_exchange_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

$resp = file_get_contents($extend_url);

parse_str($resp,$output);

$extended_token = $output['access_token'];

echo $extended_token;
于 2012-10-29T01:00:14.830 に答える
0

選択した回答は古くなっています。短期トークン(フロントエンドで提供)を長期トークン(サーバーのみ)に交換するFacebookの手順は次のとおりです。

https://developers.facebook.com/docs/facebook-login/access-tokens/refreshing/

Generate a Long-lived User or Page Access Token
You will need the following:

A valid User or Page Access Token
Your App ID
Your App Secret
Query the GET oath/access_token endpoint.

curl -i -X GET "https://graph.facebook.com/{graph-api-version}/oauth/access_token?  
    grant_type=fb_exchange_token           
    client_id={app-id}&
    client_secret={app-secret}&
    fb_exchange_token={your-access-token}" 

Sample Response
{
  "access_token":"{long-lived-access-token}",
  "token_type": "bearer",
  "expires_in": 5183944            //The number of seconds until the token expires
}
于 2019-09-30T21:43:13.190 に答える