用户希望在不刷新浏览器的情况下使用我的 facebook 应用数小时。
但是令牌会在 2 小时后过期。现在我要求用户刷新页面,但这很烦人。
我不想询问离线访问权限,因为它会吓到一些用户。
最好的解决方案是以某种方式“重新登录”并在不刷新页面的情况下获取新令牌。可能吗?
用户希望在不刷新浏览器的情况下使用我的 facebook 应用数小时。
但是令牌会在 2 小时后过期。现在我要求用户刷新页面,但这很烦人。
我不想询问离线访问权限,因为它会吓到一些用户。
最好的解决方案是以某种方式“重新登录”并在不刷新页面的情况下获取新令牌。可能吗?
我会订阅到期触发器(我认为这是 authResponseChange),然后自动执行另一个登录检查。这不是一个完美的解决方案,因为它可能会自动触发一个弹出窗口(例如,如果他们已经注销),很多浏览器可能会阻止它。相反,您可以在令牌过期时检查他们是否需要完成弹出窗口,并在您的页面上某处显示“Facebook 需要您注意继续”的通知,然后仅从他们的响应中启动弹出窗口,这将阻止弹出窗口被阻止。
FB.Event.subscribe('auth.authResponseChange', function(response) {
// do something with response
FB.login(){
// refresh their session - or use JS to display a notification they can
// click to prevent pop up issues
}
});
对此进行锻炼的算法
尝试使用 offline_access 权限获取令牌。
我想,猜这是不可能的,FB架构不允许这样做。为什么offline_access 会出现这样的问题!!!!!!...反正offline_access 是我猜的最佳解决方案....
你有没有想过使用ajax?两小时后,您将检查用户是否仍处于活动状态。如果是这样,您将 axax 请求发送到 URL,他的会话详细信息将在其中更新。例子:
$(document).ready(function(){
setInterval('update_session()', 5500000);
})
update_session(){
$.post({
URL: ..., // script to update session on server
data:{ /* username, password */ },
})
}
并且服务器端只从帖子中获取用户名和密码,或者运行重新登录。
我假设您正在使用 iframesigned_request
参数来获取您的访问令牌。实现所需的一种方法是使用 oAuth 2.0 获取访问令牌的方法。一开始时间更长;您的服务器和 Facebook 必须交换可能很慢的凭据,但这意味着您将获得一个code
可以定期交换访问令牌的凭据,这意味着您的服务器可以定期维护会话(可能来自客户端的 ajax 调用) . 然后,您会将这个新的 access_token 传递给客户端,并在您的对话调用中使用它来处理您的请求(礼物)。
希望有帮助。
斯帕比
不幸的是,我认为这在设计上是不可能的(如果您的意思是在没有用户干预的情况下发生)。如果用户仍然登录到 Facebook,您可以将顶级页面重定向到 Facebook,它会立即使用新代码将您弹回(听起来您已经这样做了),但这只有在 Facebook 上才有可能它可以检查的cookie。如果您尝试从您的服务器执行任何操作,它将被拒绝,因为该 cookie 不会伴随请求。尝试从 javascript 调用 facebook 也是如此——因为您的代码在不同的域中运行,cookie 不会伴随调用并且 Facebook 会拒绝它。Facebook 甚至可以知道用户是谁并且他们仍然登录的唯一方法是查看该 cookie。
值得一提的是,Facebook 已经阻止了唯一合乎逻辑的解决方法,即在 iframe 中加载 oauth url。如果您尝试一下,您会看到他们检测到页面正在加载到 iframe 中,并输出一个带有链接的页面,该链接执行顶级重定向以跳出框架。因此,这种方法不仅行不通,而且很明显 Facebook 已明确将其作为其架构的一部分使其成为不可能。
编辑:如果您的意思不是完全避免刷新,而是在需要新令牌时自动发生,您可以执行以下操作:
$status=0;
$data=@file_get_contents("https://graph.facebook.com/me?access_token=$token");
foreach ($http_response_header as $rh) if (substr($rh, 0, 4)=='HTTP') list(,$status,)=explode(' ', $rh, 3);
if ($status==200)
{
//token is good, proceed
}
else
{
//token is expired, get new one
$fburl="http://www.facebook.com/dialog/oauth?client_id=APP_ID&redirect_uri=".urlencode('http://apps.facebook.com/yourapp/thispage.php');
echo "<html>\n<body>\n<script>top.location='$fburl';</script>\n</body>\n</html>\n";
exit;
}
这是假设您在此代码之前有一些东西,如果存在,它将处理 signed_request 参数并将值分配给 $token (您自己的显式代码或适当的 SDK 条目)。然后可以在任何需要检查 $token 是否仍然有效的地方使用显示的代码,然后再继续。
看看https://developers.facebook.com/docs/offline-access-deprecation/#extend_token
基本上你用
https://graph.facebook.com/oauth/access_token?
client_id=APP_ID&
client_secret=APP_SECRET&
grant_type=fb_exchange_token&
fb_exchange_token=EXISTING_ACCESS_TOKEN
这将为您提供具有新到期时间的新令牌(应该是 60 天,但我注意到类似此处描述的错误https://developers.facebook.com/bugs/347831145255847/?browse=search_4f5b6e51b18170786854060)
如果您获得 access_token 而不指定任何到期时间,它们将不会到期.. 至少直到用户更改他的 Fb 凭据或取消注册您的应用程序..