【问题标题】:Facebook Graph API - Same access token for all usersFacebook Graph API - 所有用户使用相同的访问令牌
【发布时间】:2011-09-18 22:45:11
【问题描述】:

长期以来,我一直在疯狂地尝试为我的用户获取访问令牌。我在许多网站上阅读以通过使用 getSession() 并从中获取 access_token 以某种方式获取它......它给了我未定义的函数错误..我也用谷歌搜索过,所有解决方案都说使用更新后的 SDK,但我的已更新,它仍然行不通...所以我终于找到了另一种获取访问令牌的解决方案,但这似乎为所有用户提供了相同的访问令牌...知道问题出在哪里吗?所有用户肯定不能拥有相同的令牌吧?

$app_id          = $facebook->getAppId();
            $app_secret      = $facebook->getApiSecret();

            function callFb($url, $params)
            {
                $ch = curl_init();
                curl_setopt_array($ch, array(
                    CURLOPT_URL => $url,
                    CURLOPT_POSTFIELDS => http_build_query($params),
                    CURLOPT_RETURNTRANSFER => true,
                    CURLOPT_VERBOSE => true
                ));

                $result = curl_exec($ch);
                curl_close($ch);
                return $result;
            }

            $params=array('client_id'=>$app_id, 'type'=>'client_cred', 'client_secret'=>$app_secret);
            $url = "https://graph.facebook.com/oauth/access_token";
            $access_token = callFb($url, $params);
            $access_token = substr($access_token, strpos($access_token, "=")+1, strlen($access_token));     

【问题讨论】:

  • Yuliy 已经为您的问题提供了解决方案,但我有一个问题要问您。您是否打算保留这些访问令牌?请记住,您从 FB 获得的访问令牌确实会过期,除非您在获取它们时特别请求 offline_access。此外,存储 FB 用户访问令牌存在潜在的安全风险。
  • 我已获得offline_access。

标签: facebook facebook-graph-api access-token


【解决方案1】:

问题是您要求type=client_cred,它告诉 Facebook 您不需要用户的访问令牌,而是应用程序的访问令牌。这用于执行访问洞察、实时更新 API 和公共数据等操作。如果您想获取用户数据,则不应传递该标志。

如果您确实想自行访问 Graph API,您当然可以按照https://developers.facebook.com/docs/authentication/ 的说明进行操作。

【讨论】:

  • 谢谢...你能告诉我应该使用什么来代替 type=client_cred 吗?还是直接删除就行了?
  • 您根本不应该使用任何东西来代替它。如果您希望从您的 Web 服务器进行 API 调用(而不是使用 Javascript),那么您应该使用默认值(用于标准 Web 服务器流)。
  • 感谢您的帮助。让我试试。是的,我希望从 Web 服务器进行 API 调用。
  • 消除 type=client_cred 现在给我 string(79) "{"error":{"type":"OAuthException","message":"Missing redirect_uri parameter."}}"跨度>
  • 对。通读我链接到你的页面。基本思想是您将用户重定向到 graph.facebook.com/dialog/oauth,然后在他们单击权限对话框后,他们会通过代码重定向到您,然后您使用该代码获取访问令牌.
【解决方案2】:

您说您正在使用 PHP SDK,但我在您的代码中没有看到任何提及它。

正确的做法是这样的:

<?php

    require('facebook.php');

    $fb = new Facebook(array('appId' => APP_ID, 'secret' => SECRET));

    $user = $fb->getUser();

    // if we have a valid user, we're logged in
    if ($user)
    {
        // do stuff with the API using the $fb object
    }
    else
    {
        // redirect the user to the authentication page
        header("Location: ".$fb->getLoginUrl());
    }

示例主要转述自 Facebook's SDK Github。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    相关资源
    最近更新 更多