【问题标题】:Facebook api doesn't return the access tokenFacebook api 不返回访问令牌
【发布时间】:2015-11-15 23:15:10
【问题描述】:

我的要求:在我的网络应用程序中提交表单时,自动在 facebook 粉丝页面中发布链接。

所以我有以下代码(从 facebook suggestion 复制/粘贴)

        $appId = "...";
        $appSecret = "...";


        $fb = new Facebook\Facebook([
            'app_id' => $appId,
            'app_secret' => $appSecret,
        ]);

        $helper = $fb->getRedirectLoginHelper();

        try {
            $accessToken = $helper->getAccessToken();
        } 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;
        }

        if (!isset($accessToken)) {
            if ($helper->getError()) {
                header('HTTP/1.0 401 Unauthorized');
                echo "Error: " . $helper->getError() . "\n";
                echo "Error Code: " . $helper->getErrorCode() . "\n";
                echo "Error Reason: " . $helper->getErrorReason() . "\n";
                echo "Error Description: " . $helper->getErrorDescription() . "\n";
            } else {
                header('HTTP/1.0 400 Bad Request');
                echo 'Bad request';
            }
            exit;
        }

// Logged in  
        echo '<h3>Access Token</h3>';
        var_dump($accessToken->getValue());

// The OAuth 2.0 client handler helps us manage access tokens  
        $oAuth2Client = $fb->getOAuth2Client();

// Get the access token metadata from /debug_token  
        $tokenMetadata = $oAuth2Client->debugToken($accessToken);
        echo '<h3>Metadata</h3>';
        var_dump($tokenMetadata);

// Validation (these will throw FacebookSDKException's when they fail)  
        $tokenMetadata->validateAppId($config['app_id']);
// If you know the user ID this access token belongs to, you can validate it here  
// $tokenMetadata->validateUserId('123');  
        $tokenMetadata->validateExpiration();

        if (!$accessToken->isLongLived()) {
            // Exchanges a short-lived access token for a long-lived one  
            try {
                $accessToken = $oAuth2Client->getLongLivedAccessToken($accessToken);
            } catch (Facebook\Exceptions\FacebookSDKException $e) {
                echo "<p>Error getting long-lived access token: " . $helper->getMessage() . "</p>";
                exit;
            }
            echo '<h3>Long-lived</h3>';
            var_dump($accessToken->getValue());
        }

        $_SESSION['fb_access_token'] = (string) $accessToken;

但是输出是Bad request。我尝试使用另一个 appId,但仍然出现错误。

【问题讨论】:

  • 我建议从帖子中删除 api id 和 api secrets
  • 这是 login.php 重定向的后备页面,你有 login.php 吗?它返回任何错误?
  • 我不明白。用户不应登录 facebook。
  • 好吧,您从文档中获取登录示例。你是那个 facebook 粉丝页面的所有者吗?

标签: php facebook facebook-graph-api facebook-php-sdk


【解决方案1】:

根据 Facebook 文档:

FacebookRedirectLoginHelper 利用会话来存储 CSRF 价值。您需要确保在调用之前启用了会话 getLoginUrl() 方法。这通常在大多数情况下自动完成 web 框架,但如果你不使用 web 框架,你可以添加 session_start();到您的 login.php 和 login-callback.php 的顶部 脚本。您可以覆盖默认会话处理 - 请参阅 扩展点如下。

确保存在有效会话,或在脚本顶部使用 session_start()。

【讨论】:

【解决方案2】:

该代码用于使用 facebook 登录。

要以管理员身份发布到粉丝专页,请尝试以下操作:

$appid = 'XXX'; //your app id
$appsecret = 'XXX'; //your app secret
$pageId = 'XXX'; //your page id
use Facebook\FacebookRequest;
require  'your_path/Facebook/autoload.php';
$facebook = new Facebook(array(
  'appId' => $appid,
  'secret' => $appsecret,
  'cookie' => false,
));

$user = $facebook->getUser();

if ($user) {
  try {
    $page_info = $facebook->api("/$pageId?fields=access_token");
    if (!empty($page_info['access_token'])) {
      $args = array(
        'access_token' => $page_info['access_token'],
        'message' => 'www.test.com' /example
      );

      $postId = $facebook->api("/$pageId/feed", "post", $args);
    }
  } catch (FacebookApiException $e) {
    error_log($e);
    $user = null;
 }
}

【讨论】:

  • $facebook Facebook 的实例没有 getUser() 方法。我正在使用 SDK V5
【解决方案3】:

我在访问令牌时遇到问题。不知道是不是同样的问题。

我的 Facebook 登录无效,原因是 $accessToken = $helperget-&gt;AccessToken(); 返回错误(代码 401)。

要更正我的代码,我需要在我的AccessToken() 添加我的回调 url。 (我在 facebook 开发者网站中的 URI 配置也是如此)。

$accessToken = $helper->getAccessToken('www.domain.com/callback');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 2011-11-13
    • 2012-01-02
    • 2012-04-22
    • 1970-01-01
    相关资源
    最近更新 更多