我知道我可以要求:
https://graph.facebook.com/me?access_token=ACCESS_TOKEN
但是“我”指的是“活动用户”,大概是在这台机器上登录到 facebook 的用户,这将是服务器,我需要客户端端 user_id 的 facebook 用户,所以我的服务器可以向 GraphAPI 提出关于该用户使用以下格式:
https://graph.facebook.com/USER_ID?access_token=ACCESS_TOKEN
我知道我可以要求:
https://graph.facebook.com/me?access_token=ACCESS_TOKEN
但是“我”指的是“活动用户”,大概是在这台机器上登录到 facebook 的用户,这将是服务器,我需要客户端端 user_id 的 facebook 用户,所以我的服务器可以向 GraphAPI 提出关于该用户使用以下格式:
https://graph.facebook.com/USER_ID?access_token=ACCESS_TOKEN
我猜你错过了不仅与 Facebook 相关的用户身份验证概念的基础知识。
让我们假设两个用户A和B访问过domain.com/fb_profile.php
,其中包含(来自 PHP-SDK 的示例文件):
<?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
他们都成功登录,页面重新加载。现在发生的事情是我们对两个用户都有一个有效的会话!
当fb_profile.php
从用户A(客户端)请求时,$facebook->api('/me');
将保留来自该特定请求(客户端)的“活动用户”详细信息!并且您的机器(服务器)将为所有登录用户保留会话!
因此,每次从具有有效会话的客户端fb_profile.php
请求时,执行结果将与来自该特定客户端的特定会话相关!$facebook->api('/me');
所以你在这里所说的(粗体)是错误的:
但是“我”指的是“活跃用户”,大概是在这台机器上登录到 Facebook 的用户,这台机器 将是服务器
顺便说一句,当你有一个有效的会话时:
$facebook->api('/me');
和:
$facebook->api('/USER_ID');
将返回相同的信息(当然USER_ID
是在客户端登录的用户的 id)。
查看 SDK 的源代码,我发现他们从访问令牌中解析了 user_id:
/*
* access_token:
* 1249203702|2.h1MTNeLqcLqw__.86400.129394400-605430316|-WE1iH_CV-afTgyhDPc
* |_______|
* |
* user id
*/
但是一个人不应该这样做,因为您的应用程序应该将它们重定向到登录页面,而不是请求令牌,然后 facebook 将使用 access_token 和 user_id 重新发布签名请求。关于授权的 facebook 文档(似乎已经更新)错误地告诉应用程序请求令牌,但这仅适用于网站而不是应用程序。我发现 facebook 文档一直告诉人们它是多么简单,但他们却未能简单地解释它并且无论如何都会出错......