-1

私はこの質問を Facebook Developer Group に投稿しましたが、誰も完全な答えを出すことができませんでした. サーバー側認証を使用する Facebook アプリケーションがあります。コードは次のようになります。

$config = array();
  $config['appId'] = $fbconfig['appid'];
  $config['secret'] = $fbconfig['secret'];
  $config['fileUpload'] = false; // optional

  $facebook = new Facebook($config);


    //Facebook Authentication part

    $mobile = false;
    $code = false;
    if (isset($_GET["code"]) && !empty($_GET["code"]) && strlen($_GET["code"])>1){
    $code  = trim($_GET["code"]);


    }

    //MOB VAR
if (isset($_REQUEST['mob']) && !empty($_REQUEST['mob']))
    {
    mobile = true; 

    }else{

         }



    if ($mobile){
 $loginUrl = $facebook->getLoginUrl(
     array(
     'redirect_uri' => $fbconfig['baseUrl'].$loginpart,
     'scope'  => 'email,user_likes'
          )
                                    );

 $token_url = "https://graph.facebook.com/oauth/access_token?client_id=".APP_ID."&redirect_uri=".urlencode($fbconfig['baseUrl'].$loginpart)."&client_secret=".$fbconfig['secret']."&code=".$code;
}else{


 $loginUrl = $facebook->getLoginUrl(
            array(
            'redirect_uri' => $fbconfig['appBaseUrl'].$loginpart,
            'scope'  => 'email,user_likes'
                 )
                                    );
$token_url = "https://graph.facebook.com/oauth/access_token?client_id=".APP_ID."&redirect_uri=".urlencode($fbconfig['appBaseUrl'].$loginpart)."&client_secret=".$fbconfig['secret']."&code=".$code;
}




if ((!isset($_GET['code']) || empty($_GET['code']) ) ) {
        echo "<script type='text/javascript'>top.location.href = '$loginUrl';</script>";
        exit;
    } else{
   if ($code){
    $response  =  file_get_contents($token_url);

    $params  = null;
    parse_str($response, $params);
    $access_token = $sessionKey = $AccessToken = $params['access_token'];

    if(isset($AccessToken) && !empty($AccessToken)){
    if(isset($params['expires'])){
      $ExpDate = $params['expires'];

迷惑にならないようにコードを短くしました。


問題

何らかの理由で、コードは$ExpDate3000 秒から 7000 秒の短い値を返します。これはすべてのユーザーではなく、10% ~ 15% のユーザーに発生します。

私が試したこと

  • Facebook は長寿命の access_token を返す必要があるという事実にもかかわらず、私はそれを/oauth/access_token?URL と交換しようとしました。結果なし: 同じ有効期限を返します。
  • $SERVER['HTTP_USER_AGENT']私は、短命の access_tokens でユーザーが持っている共通点を見つけるためにキャッチしようとしました。結果なし: すべてが異なります (モバイル デバイス、デスクトップ、IOS ネイティブ Facebook アプリからのものである可能性があります....)
  • プライバシー設定から可能なすべてのバージョンに設定を変更し、アプリケーションをインストール、削除して、状況を再現しようと何度も試みました。結果はありません:私にとっては完璧に機能します。
  • ユーザーのコードを保存し、access_token を手動で取得しようとしました。コードは一度しか使用できないことを忘れていたので、それを行うことができませんでした.

どうすれば助けられますか

  • 誰かが同じ認証方法を使用している場合は、データベースを確認してください。同じ問題がありますか?
  • 誰かがなぜこれが起こるのか考えているなら、理由を見つけるのを手伝ってください.
  • これがバグであることが判明した場合は、Facebook でバグ レポートを作成できます。

ありがとうございました。

4

1 に答える 1

0

あなたが見ている動作は正しいです。

現在、コードを有効期間の短いアクセス トークンと交換しています。これは必須です。Facebook がoffline_accessアクセス許可を削除したため、有効期間の長いアクセス トークンを取得する唯一の方法は、有効期間の短いアクセス トークンを有効期間の長いアクセス トークンに交換することです。

OAuth に関連する特にシナリオ 4の offline_access の削除に関する記事を参照してください。これは、彼らが長期アクセストークンの概念を導入し、それを取得する方法を説明した場所です.

これを達成するための簡単な話は、短命のアクセス トークンを取得することです。AQADEADBEEF と言って、これを取得します...

https://graph.facebook.com/oauth/access_token?grant_type=fb_exchange_token&client_id={client_id}&client_secret={client_secret}&fb_exchange_token=AQADEADBEEF

grant_type、client_id、client_secret、および fb_exchange_token の 4 つのパラメーターに注意してください。URLは元のアクセストークンを取得したときと同じですが、パラメーターが少し異なります。必要に応じてclient_idとを挿入しますclient_secret

その後、有効期限がはるかに長いアクセストークンを取得します-90日だと思います. Facebook は、アクセス トークンの長さについて非常にあいまいです。賞味期限は手に入れて初めてわかります。有効期間の長いアクセス トークンは期限切れになり、Facebook は現在それを更新する方法を提供していません。

于 2013-05-24T14:19:00.417 に答える