Facebook:“此授权代码已被使用。”,“type”:“OAuthException”,“code”:100

时间:2014-06-04 14:09:33

标签: php facebook api facebook-graph-api

我刚刚升级到PHP 5.4.19和facebook-php-sdk-v4。

难道只是我还是让FB故意难以整合?!例如,我没有使用Composer(无法在我的共享主机上安装它),因此加载新类需要一个特定的(自己发现)订单 - 这就足够了! http://metah.ch/blog/2014/05/facebook-sdk-4-0-0-for-php-a-working-sample-to-get-started/建议的解决方案并不完全正确。

无论如何,当我终于让它运行并启用了#34; App Secret Proof for Server API调用"在下面 应用高级设置标签为recommended by Facebook我进入了捕获22。

就是这样:

1)从我的服务器进行FB API调用,例如$request = new FacebookRequest($session, 'GET', '/me');我现在必须提供appsecret_proof论证。

2)要创建appsecret_proof,我需要一个access_token,即$appsecret_proof= hash_hmac('sha256', $access_token, $app_secret);

3)要获得一个只有$ _GET ['代码']的access_token,我必须通过以下方式进行代码交换 GET https://graph.facebook.com/oauth/access_token? client_id={app-id} &redirect_uri={redirect-uri} &client_secret={app-secret} &code={code-parameter}

4)要调用FB进行代码交换,我收到错误{"error":{"message":"This authorization code has been used.","type":"OAuthException","code":100}}

因此出现两个问题:

1)除了通过代码交换,我还能如何获得access_token,以便我可以使用该令牌创建appsecret_proof并依次调用FacebookRequest?

2)在哪里/如何将appsecret_proof放入FacebookRequest?这可能就是这样$request = new FacebookRequest($session, 'GET', '/me', array("appsecret_proof" => $appsecret_proof));?我似乎无法找到关于如何在PHP API中使用appsecret_proof的具体说明(很清楚如何通过带有Graph API的http来实现)。

1 个答案:

答案 0 :(得分:12)

女士们,先生们,我解决了所有问题 - 我只需要使用$access_token = $session->getToken();。这帮助我否定了导致OAuthException的代码交换的呼吁,因为Facebook已经改变了他们对交换代码的政策被多次使用。

现在"服务器API调用的应用秘密证明"在Facebook推荐的App高级设置选项卡下正确启用。

完整的具体解决方案:

$app_id = 'APPID'; $app_secret = 'APPSECRET';
FacebookSession::setDefaultApplication($app_id, $app_secret);
$redirect_url = "https://mydomain.com/login";
$helper = new FacebookRedirectLoginHelper($redirect_url);

try {
    $session = $helper->getSessionFromRedirect();
} catch (FacebookRequestException $ex) {
} catch (Exception $ex) {
}

if (isset($session)) {
    $access_token = $session->getToken();
    $appsecret_proof = hash_hmac('sha256', $access_token, $app_secret);
    $request = new FacebookRequest($session, 'GET', '/me', array("appsecret_proof" =>  $appsecret_proof));
    $response = $request->execute();
    $graphObject = $response->getGraphObject();

   echo print_r($graphObject, 1);
} else {
    echo '<a href="' . $helper->getLoginUrl() . '">Login</a>';
}