_offline_access
_ Permission はFacebookの Authentication フローで非推奨になっているため、その許可なしでいわゆる長寿命のアクセストークンを取得する際に問題が発生します。
非推奨に関するFacebookのドキュメント では、サーバー側OAuth生成されたアクセストークンは長持ちしますが、そうではありません。
何か不足していますか?アプリの設定に何らかの設定がありますか?アクセストークンの有効期限を延長するために使用する必要がある特別なコードはありますか?ドキュメントを理解すると、サーバー側認証の場合、ユーザーがログインしているときにPHP SDK)のgetAccessToken()
メソッドによってアクセストークンが有効になります。
編集(2012年8月14日):
1週間前、公式のFacebook PHP SDKが更新されました。関数名はsetExtendedAccessTokenに変更されました。 2つのアクティブなセッションを持つリスクを除去するために、実際にその後セッションを破棄する必要がありました。
また、関数は実際にはトークンを返さず、代わりに永続データ内にトークンを保存します。したがって、後でパブリック関数getAccessTokenを使用して新しいアクセストークンを取得できます。 公式Facebook PHP SDK githubページ から新しいSDKを入手して、最新であることを確認してください。
元の答え:
Base_facebook.phpファイルに新しいパブリック関数を追加しました。これは、60日で期限が切れる新しいアクセストークンを返します。通常のアクセストークンを受け取った後、この関数にリクエストを行うことができます。私はテストしていませんが、開発者アプリの詳細設定で「deprecate offline_access」を有効にする必要があると思います。
これをfacebookクラス内のbase_facebook.phpに追加して、呼び出します。わたしにはできる。
public function getExtendedAccessToken(){
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'), 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;
}
$response_params = array();
parse_str($access_token_response, $response_params);
if (!isset($response_params['access_token'])) {
return false;
}
return $response_params['access_token'];
}
実際に言われたこと:
Access_tokenがサーバー側OAuth呼び出しから生成される場合、結果のaccess_tokenはより長い有効期限になります。そのユーザーの有効なaccess_tokenがまだある間に呼び出しが行われた場合、この2番目の呼び出しから返されたaccess_tokenは同じままであり、有効期限のみが延長されます。有効期限を延長する最初の呼び出し。
つまり、クライアント側で生成されたトークンよりも長くなり、拡張トークン(60日間)を受け取るには、次のリクエストを発行して手動で行う必要があります。
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
このトークンは、いくつかの理由で無効になる可能性があり、 How-To:有効期限が切れたアクセストークンを処理する ブログ投稿で説明されている処理方法を説明します。
更新:
2012年8月7日setExtendedAccessToken
メソッドを使用してaccess_token
URLを手動で作成して詳細を取得する代わりに。
// facebookログインのポップアップにJavaScriptを使用
FB.login(function(response) {
if (response.authResponse) {
var accessToken = response.authResponse.accessToken;
//有効期限が1〜2時間のアクセストークンを取得しました
// facebookコントローラと呼ばれるコントローラにアクセストークンを取得しました
$request = $this->getRequest();
$params = $request->getParams();
$token=$params['accessToken'];
//アクセストークンを取得して60日間に延長
$conf = $this->getConfigs();
$appid = $conf['fbdetails']['appid'];
$secret = $conf['fbdetails']['secret'];
$baseurl = $conf['app']['baseurl'];
//以下のコードの実行後、アクセストークンの有効期限が60日までの応答が返されます。
$token_url = "https://graph.facebook.com/oauth/access_token?client_id=".$appid."&client_secret=".$secret."&grant_type=fb_exchange_token&fb_exchange_token=".$token;
//上記の応答は解析用です。
$c = curl_init();
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($c, CURLOPT_URL, $token_url);
$contents = curl_exec($c);
$err = curl_getinfo($c,CURLINFO_HTTP_CODE);
curl_close($c);
$paramsfb = null;
parse_str($contents, $paramsfb);
//上記の実行コードの内容を解析した後、新しい拡張アクセストークンが保存されます。
$user_session = new Zend_Session_Namespace('fbuser');
$user_session->access_token = $paramsfb['access_token'];
//セッションに保存されます。
$this->_redirect('/home');
//素敵なコーディングをする
サーバー側で生成されたアクセストークンOAuth呼び出しは拡張(より長い)種類のものであり、交換する必要はありません。既に拡張トークンです。アプリの設定で「オフラインアクセスの非推奨」を有効にする必要があります。これはもちろん、「オフラインアクセスの非推奨」が以前に無効になっている場合にのみ必要です。
その後、Facebookを介してユーザーを認証すると、60日間有効なアクセストークンを受け取ります。同じ日に複数回認証すると、最初の認証でのみ有効期限が延長されます。
[〜#〜] never [〜#〜]が[ #〜] page [〜#〜]、同様の質問に対する私の答えを参照してください here
開発者ページから:
長期間有効なユーザーアクセストークンを使用して、[ユーザーID] /アカウントエンドポイントを照会すると、ページアクセストークンを提供しますユーザーが管理するページの有効期限はありません。
以前の回答に触発されて、単純なトークン自己更新プログラムを作成しました。最初に、現在のトークンを「token.sec」ファイルに入れるだけです。
このプログラムはファイルからトークンを読み取り、すべてが問題なければ新しいトークンで更新します。他のプログラムでは、トークンを使用するだけです。
$access_token = file_get_contents("token.sec");
ここにあります:
<?php
$app_id = "<your app id>";
$app_secret = "<your app secret>";
$access_token = file_get_contents("token.sec");
$token_url="https://graph.facebook.com/oauth/access_token?"
. "grant_type=fb_exchange_token"
. "&client_id=" . $app_id
. "&client_secret=" . $app_secret
. "&fb_exchange_token=" . $access_token;
$ch = curl_init($token_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if($response === false) {
die ('Curl error: ' . curl_error($ch));
}
// Close handle
curl_close($ch);
// parse the output
parse_str($response, $params);
if(!isset($params['access_token'])) {
die("No access token");
}
echo ("New token: $access_token\n");
// eveything looks OK
rename("token.sec", "token.sec.back"); // just in case
$myfile = fopen("token.sec", "w") or die("Unable to open file!");
fwrite($myfile, $access_token);
fclose($myfile);
?>
最後に、これをcrontabに追加して、母親ごとに1回トークンを更新できます。
0 0 1 * * cd /home/<path>; php exchangeToken.php
これは、ページアクセストークンを無期限に延長し、2か月後に期限切れになるユーザーアクセストークンの寿命を延長するためです(「新しいアクセストークン」)。
わかりましたので、約1週間の調査が必要でしたが、ここに私の解決策があります。 https://developers.facebook.com/tools/Explorer/ で、access_tokenの一部としてmanage_pageがあることを確認してください。その後、アプリID、シークレット、リダイレクトでこのコードを使用します。
<?php
app_id = "APP_ID";
$app_secret = "APP_SECERET";
$post_login_url = "REDIRECT_URL";
$code = $_REQUEST['code'];
//Obtain the access_token with publish_stream permission
if(empty($code)){
$dialog_url= "http://www.facebook.com/dialog/oauth?"
. "client_id=" . $app_id
. "&redirect_uri=" . urlencode( $post_login_url)
. "&COMMA_SEPARATED_LIST_OF_PERMISSION_NAMES";
echo("<script>top.location.href='" . $dialog_url
. "'</script>");
}
else {
$token_url="https://graph.facebook.com/oauth/access_token?"
. "client_id=" . $app_id
. "&redirect_uri=". urlencode($post_login_url)
. "&client_secret=" . $app_secret
. "&code=" . $code;
$response = file_get_contents($token_url);
$params = null;
parse_str($response, $params);
$access_token = $params['access_token'];
echo 'access token: ' . $access_token.'<br>';
if($access_token){
$token_url="https://graph.facebook.com/oauth/access_token?"
. "client_id=" . $app_id
. "&redirect_uri=". urlencode($post_login_url)
. "&client_secret=" . $app_secret
.'&grant_type=fb_exchange_token'
. "&fb_exchange_token=" . $access_token;
$response = file_get_contents($token_url);
$access_token = $params['access_token'];
echo 'new access token: '.$access_token;
}
}*/
?>
その後、「新しいアクセストークン」をコピーして、 https://developers.facebook.com/tools/Explorer/ に戻ります。新しいアクセストークンでアクセストークンフィールドに移動すると、 。次に送信をクリックします。その後、ノードに+____が表示され、これをクリックして下にスクロールします。アカウントをクリックしてください。アクセストークンが必要なページを見つけて、アクセスキーフィールドにコピーして貼り付けます。 [デバッグ]をクリックすると、有効期限が切れないことがわかります。アプリのシークレットをリセットしない限り、そのトークンは有効のままになります。