用户希望在不刷新浏览器的情况下使用我的Facebook应用程序数小时 但令牌在2小时后到期。现在我要求用户刷新页面,但这很烦人 我不想要求离线访问权限,因为它会吓到一些用户。
最佳解决方案将以某种方式“重新登录”并获取新令牌而不刷新页面。 有可能吗?
答案 0 :(得分:3)
我会订阅到期触发器(我认为这是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
}
});
答案 1 :(得分:2)
在此
上锻炼的算法答案 2 :(得分:1)
你有没有想过使用ajax?两个小时后,您将检查用户是否仍处于活动状态。如果是,则将axax请求发送到URL,其中将更新其会话详细信息。例如:
$(document).ready(function(){
setInterval('update_session()', 5500000);
})
update_session(){
$.post({
URL: ..., // script to update session on server
data:{ /* username, password */ },
})
}
并且服务器端只从post发出用户名和密码,然后运行relogin。
答案 3 :(得分:1)
尝试使用offline_access权限获取令牌。
答案 4 :(得分:1)
我认为,猜测这是不可能的,FB架构不会允许它。为什么offline_access出现这样的问题!!!!!! ...无论如何,offline_access是我猜的最佳解决方案....
答案 5 :(得分:0)
不幸的是我认为这是不可能的设计(如果你的意思是它没有用户干预)。如果用户仍然登录到Facebook,您可以将顶级页面重定向到Facebook,它会使用新代码向右反弹(因为它听起来像您已经在做),但这只能是因为Facebook它可以检查的cookie。如果您尝试从服务器执行任何操作,它将被拒绝,因为该cookie不会随请求一起提供。尝试从javascript调用facebook也是如此 - 由于您的代码在不同的域中运行,因此cookie不会伴随调用而Facebook会拒绝它。 Facebook甚至可以知道用户是谁以及他们仍然登录的唯一方法是查看该cookie。唯一可行的方法是将浏览器本身重定向到facebook.com域。
值得一提的是,Facebook已经阻止了唯一的逻辑解决方法,即在iframe中加载oauth网址。如果您尝试它,您将看到他们检测到页面正在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是否仍然有效的任何地方使用所显示的代码。
答案 6 :(得分:0)
如果您获得access_token而未指定任何到期日期,则它们将不会过期。 至少在用户更改其Fb凭证或注册您的应用程序之前至少..
答案 7 :(得分:0)
我认为您使用iframe signed_request
参数来获取访问令牌。实现所需要的一种方法是使用oAuth 2.0方法获取访问令牌。这在第一时间更长;你的服务器和Facebook必须交换可能很慢的凭据,但这意味着你将获得一个code
,可以定期交换访问令牌,这意味着你的服务器可以定期维护会话(可能来自ajax)来自客户的电话)。然后,您将这个新的access_token传递给客户端,并在对话调用中使用它来处理您的请求(礼物)。
希望有所帮助。
Spabby
答案 8 :(得分:0)
查看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
它将为您提供具有新到期时间的新令牌(它应该是60d,但我注意到类似的错误,如此处所述https://developers.facebook.com/bugs/347831145255847/?browse=search_4f5b6e51b18170786854060)