【问题标题】:access token retrieved via javascript SDK seems not valid when passing to php传递给 php 时,通过 javascript SDK 检索的访问令牌似乎无效
【发布时间】:2012-03-12 16:04:02
【问题描述】:

我通过 javascript SDK 检索访问令牌并通过 windows.location 将其传递给服务器:

<script src='https://connect.facebook.net/en_US/all.js'></script>
<!-- Load javascript facebook connector -->
<script>
    FB.init({
            appId : '<?=$app_id;?>',
            status : true, // check login status
            cookie : true, // enable cookies to allow the server to access the session
            xfbml : true // parse XFBML
    });
</script>
<script type="text/javascript">
    function getToken(){
    FB.login(function(response) {
        if (response.authResponse) {
            var access_token = response.authResponse.accessToken;
            window.location="<?=$_SERVER['PHP_SELF'];?>?accessToken="+access_token;
        } else {
            return false;
        }
    }, {scope:'user_likes,friends_likes'});
}
</script>

PHP 代码:

<?php
  $app_id = 'MY_APP_ID';
  $app_secret = 'MY_APP_SECRET';
  $page_id= 'MY_PAGE_ID';

  if(isset($_GET['accessToken'])){
  // Run fql query
  $fql_query_url = 'https://graph.facebook.com/'
. '/fql?q=SELECT+uid+FROM+page_fan+WHERE+page_id='.$page_id.'+AND+uid+IN+(SELECT+uid2+FROM+friend+WHERE+uid1=me())&'.$_GET['accessToken'];
  echo $fql_query_url;
  $fql_query_result = file_get_contents($fql_query_url);
  $fql_query_obj = json_decode($fql_query_result, true);

  //display results of fql query
  foreach($fql_query_obj as $v1){
    foreach($v1 as $v2){
        $x++;
    }
}
echo "You have ".$x." friends who 'like' us";

}

当我在浏览器中回显 $fql_query_url 并通过该 url 时,facebook graph api 会回答

{
   "error": {
      "message": "An access token is required to request this resource.",
      "type": "OAuthException",
      "code": 104
   }
}

我做错了什么?我确实获得了访问令牌,但它似乎无效?

【问题讨论】:

  • 尝试在developers.facebook.com/tools/lint linting 访问令牌,看看它在那里是否有效。
  • 另外,不要将访问令牌作为 GET 参数传递;它可能会泄露到您包含内容的任何第三方网站,并且可能是一个巨大的安全漏洞
  • 当我从它验证的 GET 参数中检查访问令牌时,包括正确的权限。但是 FQL 查询不返回值......当我使用相同的查询和通过图形 API 请求的访问令牌时,它正在工作。当应用程序运行时,我将通过 POST 传递访问令牌。我认为这样就足够安全了?

标签: facebook facebook-javascript-sdk facebook-php-sdk


【解决方案1】:

您在实际请求中缺少access_token,因为您只是将access_token 添加到URL 中而没有实际命名该参数。在将 $_GET['accessToken'] 添加到 URL 之前添加 access_token=

让您的源代码可读以发现此类事情真是太好了:

$query = <<<FQL
SELECT uid FROM page_fan WHERE page_id = {$page_id} AND uid IN (
  SELECT uid2 FROM friend WHERE uid1 = me()
)
FQL;
$fql_query_url = 'https://graph.facebook.com/fql?q=' . rawurlencode($query);
$fql_query_url .= '&access_token=' . rawurlencode($_GET['accessToken']);

顺便说一句,通过 GET 参数传递access_token 是一种非常糟糕的方式,尽量避免这种情况。

【讨论】:

  • 谢谢,问题解决了!我将在最终脚本中使用 POST。
猜你喜欢
  • 2015-12-20
  • 1970-01-01
  • 2012-06-22
  • 2020-12-10
  • 2022-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-19
相关资源
最近更新 更多