无法从 FB sdk 获取 accessToken

Cant get an accessToken from FB sdk

我想从我的 Instagram 帐户获取图片到我的网页。所以我尝试使用FB php sdk并根据这个documentation首先获取accessToken。但它 returns 无效。我不知道代码有什么问题。

public function getMedia()
{
    $fb = new \Facebook\Facebook([
        'app_id' => self::APP_ID,
        'app_secret' => self::APP_SECRET,
        'default_graph_version' => 'v2.10',
        //'default_access_token' => '{access-token}', // optional
    ]);

    $helper = $fb->getRedirectLoginHelper();  // Whichever helper I use access-token is null

    dd($helper->getAccessToken());
}

我需要帮助。原来如此简单

编辑:

几个小时后我得到了这个,但最后一个命令抛出一个 Facebook\Exceptions\FacebookResponseException 无效的 OAuth 访问令牌签名。如我所见,令牌是应用程序 ID 和应用程序密码与管道连接。 “733163597544229|xxxxxxxxxxxxx9d14362xxxx3a6”。这应该有效但无效。

public function getMedia()
{
    $fb = new \Facebook\Facebook([
        'app_id' => self::APP_ID_FB,
        'app_secret' => self::APP_SECRET_FB,
        'default_graph_version' => 'v2.10',
        //'default_access_token' => '{access-token}', // optional
    ]);

    $token = $fb->getApp()->getAccessToken();
    $response = $fb->get('https://graph.instagram.com/me/media?fields=media_url,media_type', $token->getValue());

} 

如果我没有正确理解文档,如果您想动态获取访问令牌,根据 https://developers.facebook.com/docs/facebook-login/web,您需要为您的应用程序启用 fb-login

  1. https://developers.facebook.com/apps/
  2. select 你的应用程序
  3. 添加 fb-login 并按照提示操作。

否则,您应该只能从 Web 界面为您的应用程序获取访问令牌并反复使用它。

另请参阅:https://developers.facebook.com/docs/facebook-login/access-tokens#apptokens

还有:

https://developers.facebook.com/tools/explorer/?method=GET&path=me%3Ffields%3Did%2Cname&version=v9.0

这使您能够生成访问令牌,并测试对图形的调用 api,并允许您导出代码 copy/paste:

try {
  // Returns a `FacebookFacebookResponse` object
  $response = $fb->get(
    '/me',
    '{access-token}'
  );
} catch(FacebookExceptionsFacebookResponseException $e) {
  echo 'Graph returned an error: ' . $e->getMessage();
  exit;
} catch(FacebookExceptionsFacebookSDKException $e) {
  echo 'Facebook SDK returned an error: ' . $e->getMessage();
  exit;
}
$graphNode = $response->getGraphNode();

编辑:

我在你原来的问题中看到你说:

As I see the token is app id and app secret joined with pipe. "733163597544229|xxxxxxxxxxxxx9d14362xxxx3a6". This should work but does not work.

根据文档,如果你想提供一个访问令牌作为 {app_id}|{client-token}(不确定你在这里使用的是什么秘密)你应该将它附加到 URL,这不是在您正在使用的 URL 中。

参见此处示例:https://developers.facebook.com/docs/facebook-login/access-tokens#clienttokens

他们使用的URL是:

curl -i -X GET "https://graph.facebook.com/{your-user-id}/accounts?access_token={user-access-token}

所以对你来说是:

$response = $fb->get('https://graph.instagram.com/me/media?fields=media_url,media_type&access_token=733163597544229|{client_token}');

编辑 2:

我设法使您的示例正常工作,因此这些屏幕截图可能会有所帮助:

PHP代码:

<?php
$accessToken="EAAJIZAj**************************************************************************************************************************************************************************ZD";

require_once __DIR__ . '/Facebook/autoload.php'; // change path as needed

//echo __DIR__ . '/Facebook/autoload.php';
$fb = new \Facebook\Facebook([
    'app_id' => '642**********502',
    'app_secret' => '0185*****************f743',
    'default_graph_version' => 'v2.10',
    'default_access_token' => "{$accessToken}"
]);

try {
    // Get the \Facebook\GraphNodes\GraphUser object for the current user.
    // If you provided a 'default_access_token', the '{access-token}' is optional.
    $response = $fb->get('/me');
} catch(\Facebook\Exceptions\FacebookResponseException $e) {
    // When Graph returns an error
    echo 'Graph returned an error: ' . $e->getMessage();
    exit;
} catch(\Facebook\Exceptions\FacebookSDKException $e) {
    // When validation fails or other local issues
    echo 'Facebook SDK returned an error: ' . $e->getMessage();
    exit;
}

$me = $response->getGraphUser();
echo 'Logged in as ' . $me->getName();

?>

我从 https://github.com/facebookarchive/php-graph-sdk 获取源代码并将 src/Facebook 目录复制到我的项目中。我修改了代码中的路径位置

require_once __DIR__ . '/Facebook/autoload.php'; // change path as needed

//echo __DIR__ . '/Facebook/autoload.php'; //<< comment out everything else and check the path is correct with this.

工作代码:(同上)成功输出显示在屏幕截图的底部。

如果您需要获取应用程序密码,请转到应用程序设置以发现它:

看来你是对的 - 访问令牌确实有期限,自从昨天使用它以来我不得不刷新我的。

据我所知,这可能无法获取访问令牌。 要获取访问令牌,您需要在您的应用程序中使用 facebook 实现登录以获取访问令牌。如果您的应用仅供有限用户使用,那么您可以获得此 link https://developers.facebook.com/tools/explorer/ 上的访问令牌,但如果您的应用被广泛的用户使用并且每个用户都有自己的数据,那么您需要实施您应用中的 oauth2