一旦我有access_token,我如何获得关联的user_id服务器端?

时间:2011-01-23 15:38:39

标签: facebook facebook-graph-api oauth-2.0

我知道我可以要求:

https://graph.facebook.com/me?access_token=ACCESS_TOKEN 

但是'我'指的是'活跃用户',大概是用户登录到这台机器上的facebook,这将是服务器,我需要客户端的facebook用户端user_id所以我的服务器可以发出请求有关该用户的GraphAPI使用格式:

https://graph.facebook.com/USER_ID?access_token=ACCESS_TOKEN 

2 个答案:

答案 0 :(得分:0)

我猜你错过了用户身份验证概念的基本原理,这不仅与Facebook有关。

让我们假设有两个用户 A & B 访问了domain.com/fb_profile.php,其中包含(PHP-SDK中的example文件):

<?php

require '../src/facebook.php';

$facebook = new Facebook(array(
  'appId'  => 'APPLICATION_ID',
  'secret' => 'APPLICATION_SECRET',
  'cookie' => true,
));


$session = $facebook->getSession();

$me = null;
// Session based API call.
if ($session) {
  try {
    $uid = $facebook->getUser();
    $me = $facebook->api('/me');
  } catch (FacebookApiException $e) {
    error_log($e);
  }
}

// rest of code

他们都成功登录,并重新加载页面。现在发生的事情是我们有两个用户的有效会话!
当用户 A 客户端)请求fb_profile.php时,$facebook->api('/me');将保留“活动用户”详细信息那个具体要求(客户)!并且您的计算机(服务器)将持有 所有 登录用户的会话!

因此,每次从具有有效会话的客户端请求fb_profile.php时,执行$facebook->api('/me');的结果将与特定的相关联来自特定客户端的会话!

那你在这里说的是什么(粗体)是错误的:

  

但'我'指的是'活跃的   用户'可能是用户   在这台机器上登录到facebook   哪个是服务器

顺便说一下,当你有一个有效的会话时:

$facebook->api('/me');

并且:

$facebook->api('/USER_ID');

将返回相同的信息(当然USER_ID是在客户端登录的用户的ID 。)

答案 1 :(得分:0)

查看SDK的源代码,我发现他们从访问令牌中解析了user_id:

        /*
         * access_token:
         *   1249203702|2.h1MTNeLqcLqw__.86400.129394400-605430316|-WE1iH_CV-afTgyhDPc
         *                                               |_______|
         *                                                   |
         *                                                user id
         */

但是一个人不应该这样做,而不是请求令牌,你的应用程序应该将它们重定向到登录页面,之后facebook将使用access_token和user_id重新发布signed_request。关于授权的facebook文档(似乎已经更新)错误地告诉应用程序请求令牌,但这仅适用于不是应用程序的网站。我发现facebook docs如何继续告诉一个人有多简单但是他们无法简单地解释它并且出错了...