我已经在 Facebook 开发者小组中发布了这个问题,但没有人能给出一个有竞争力的答案。我有一个使用服务器端身份验证的 Facebook 应用程序。代码如下所示:
$config = array();
$config['appId'] = $fbconfig['appid'];
$config['secret'] = $fbconfig['secret'];
$config['fileUpload'] = false; // optional
$facebook = new Facebook($config);
//Facebook Authentication part
$mobile = false;
$code = false;
if (isset($_GET["code"]) && !empty($_GET["code"]) && strlen($_GET["code"])>1){
$code = trim($_GET["code"]);
}
//MOB VAR
if (isset($_REQUEST['mob']) && !empty($_REQUEST['mob']))
{
mobile = true;
}else{
}
if ($mobile){
$loginUrl = $facebook->getLoginUrl(
array(
'redirect_uri' => $fbconfig['baseUrl'].$loginpart,
'scope' => 'email,user_likes'
)
);
$token_url = "https://graph.facebook.com/oauth/access_token?client_id=".APP_ID."&redirect_uri=".urlencode($fbconfig['baseUrl'].$loginpart)."&client_secret=".$fbconfig['secret']."&code=".$code;
}else{
$loginUrl = $facebook->getLoginUrl(
array(
'redirect_uri' => $fbconfig['appBaseUrl'].$loginpart,
'scope' => 'email,user_likes'
)
);
$token_url = "https://graph.facebook.com/oauth/access_token?client_id=".APP_ID."&redirect_uri=".urlencode($fbconfig['appBaseUrl'].$loginpart)."&client_secret=".$fbconfig['secret']."&code=".$code;
}
if ((!isset($_GET['code']) || empty($_GET['code']) ) ) {
echo "<script type='text/javascript'>top.location.href = '$loginUrl';</script>";
exit;
} else{
if ($code){
$response = file_get_contents($token_url);
$params = null;
parse_str($response, $params);
$access_token = $sessionKey = $AccessToken = $params['access_token'];
if(isset($AccessToken) && !empty($AccessToken)){
if(isset($params['expires'])){
$ExpDate = $params['expires'];
我缩短了代码以免惹恼您。
问题
由于某种原因,代码返回短$ExpDate
,可以从 3000 秒到 7000 秒。这种情况并非发生在所有用户身上,而是发生在其中 10%-15% 的用户身上。
我试过的
- 尽管 Facebook 应该返回长期存在的 access_token,但我尝试将其与
/oauth/access_token?
url 进行交换。无结果:返回相同的过期时间。 - 我试图
$SERVER['HTTP_USER_AGENT']
找出用户与短期 access_tokens 的共同点。没有结果:一切都不一样(它们可以来自移动设备、桌面、IOS 原生 Facebook 应用程序......) - 我将我的设置从隐私设置更改为每个可能的版本,多次安装、删除应用程序试图重现这种情况。没有结果:对我来说效果很好。
- 我保存了用户的代码并尝试手动获取 access_token。我无法做到这一点,因为我忘记了代码只能使用一次。
你们怎么能帮忙
- 如果有人具有相同的身份验证方法,请检查您的数据库。你有同样的问题吗?
- 如果有人有想法为什么会发生这种情况,请帮助找出原因。
- 如果我们发现这是一个错误,我们可以在 Facebook 上创建错误报告
谢谢你。