无法从FB SDK获取accessToken

问题描述

我想将图像从我的Instagram帐户获取到我的网页。因此,我尝试使用FB PHP sdk并首先根据此documentation获取accesstoken。但它返回null。我不知道代码有什么问题。

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,// 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. 选择您的应用
  3. 添加fb登录并按照提示进行操作。

否则,您应该只能够从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的调用,并允许您导出可复制/粘贴的代码:

enter image description here

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();

编辑:

在您最初提出的问题中,我指出:

如我所见,令牌是与管道结合在一起的应用ID和应用机密。 “ 733163597544229 | xxxxxxxxxxxxx9d14362xxxx3a6”。这应该可以,但是不可以。

根据文档,如果您想以{app_id}|{client-token}的形式提供访问令牌(不确定在此使用的是什么秘密),则应将其附加到网址(而不是您所使用的网址)中使用。

在此处查看示例: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.

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

enter image description here

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

enter image description here

看来您是对的-访问令牌确实已过期,自昨天使用以来,我不得不刷新自己的令牌。

,

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...