web-dev-qa-db-ja.com

offline_accessの廃止以降、アクセストークンの有効性を延長する方法

_offline_access_ Permission はFacebookの Authentication フローで非推奨になっているため、その許可なしでいわゆる長寿命のアクセストークンを取得する際に問題が発生します。

非推奨に関するFacebookのドキュメント では、サーバー側OAuth生成されたアクセストークンは長持ちしますが、そうではありません。

何か不足していますか?アプリの設定に何らかの設定がありますか?アクセストークンの有効期限を延長するために使用する必要がある特別なコードはありますか?ドキュメントを理解すると、サーバー側認証の場合、ユーザーがログインしているときにPHP SDK)のgetAccessToken()メソッドによってアクセストークンが有効になります。

60
Rok Dominko

編集(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'];
}
72
Marc Hoogvliet

実際に言われたこと:

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を手動で作成して詳細を取得する代わりに。

22
Juicy Scripter

// 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');

//素敵なコーディングをする

10
gokul bs

サーバー側で生成されたアクセストークンOAuth呼び出しは拡張(より長い)種類のものであり、交換する必要はありません。既に拡張トークンです。アプリの設定で「オフラインアクセスの非推奨」を有効にする必要があります。これはもちろん、「オフラインアクセスの非推奨」が以前に無効になっている場合にのみ必要です。

その後、Facebookを介してユーザーを認証すると、60日間有効なアクセストークンを受け取ります。同じ日に複数回認証すると、最初の認証でのみ有効期限が延長されます。

3
Robert Kajic

[〜#〜] never [〜#〜][ #〜] page [〜#〜]、同様の質問に対する私の答えを参照してください here

開発者ページから:

長期間有効なユーザーアクセストークンを使用して、[ユーザーID] /アカウントエンドポイントを照会すると、ページアクセストークンを提供しますユーザーが管理するページの有効期限はありません。

2
Pete

以前の回答に触発されて、単純なトークン自己更新プログラムを作成しました。最初に、現在のトークンを「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
0
Sung Kim

これは、ページアクセストークンを無期限に延長し、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/ に戻ります。新しいアクセストークンでアクセストークンフィールドに移動すると、 。次に送信をクリックします。その後、ノードに+____が表示され、これをクリックして下にスクロールします。アカウントをクリックしてください。アクセストークンが必要なページを見つけて、アクセスキーフィールドにコピーして貼り付けます。 [デバッグ]をクリックすると、有効期限が切れないことがわかります。アプリのシークレットをリセットしない限り、そのトークンは有効のままになります。

0
Aaron Dartt