我已经在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%。
/oauth/access_token?
网址交换它。没有
结果:它返回相同的过期时间。$SERVER['HTTP_USER_AGENT']
找出内容
用户常见的是短生活access_tokens。没有
结果:一切都不一样(他们可以来自移动设备,
桌面,IOS原生Facebook应用....)谢谢。
答案 0 :(得分:0)
您所看到的行为是正确的。
您目前正在交换代码以获取短期访问令牌 - 这是必需的。由于Facebook删除了offline_access
权限,获得更长期访问令牌的唯一方法是将长期访问令牌交换为长期访问令牌。
请参阅有关OAuth的removal of offline_access具体方案4中的文章。这是他们引入长期访问令牌的概念并告诉您如何获得令牌的地方。
要实现这一目标的简短故事就是采用你的短命访问令牌 - 比如说AQADEADBEEF并获得这个......
https://graph.facebook.com/oauth/access_token?grant_type=fb_exchange_token&client_id={client_id}&client_secret={client_secret}&fb_exchange_token=AQADEADBEEF
注意4个参数grant_type,client_id,client_secret和fb_exchange_token。 URL与获取原始访问令牌时的URL相同,但参数略有不同。根据需要插入client_id
和client_secret
然后,您将获得一个访问令牌,其到期时间更长 - 我相信90天。 Facebook对任何访问令牌的长度都很模糊。当你得到它时,你只会知道它的到期时间。长期访问令牌仍将过期,Facebook目前无法续订。