2

用户希望在不刷新浏览器的情况下使用我的 facebook 应用数小时。
但是令牌会在 2 小时后过期。现在我要求用户刷新页面,但这很烦人。
我不想询问离线访问权限,因为它会吓到一些用户。

最好的解决方案是以某种方式“重新登录”并在不刷新页面的情况下获取新令牌。可能吗?

4

9 回答 9

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
  }
});
于 2011-09-19T08:04:07.067 回答
2

对此进行锻炼的算法

  1. 请求用户的许可
  2. 保存令牌
  3. 定期检查访问令牌是否即将过期
  4. 如果它在到期时,嵌入一些虚拟 iframe,它重定向到 facebook 主页。-在不刷新页面的情况下扩展身份验证令牌
  5. 这应该刷新令牌。您可能需要生成另一个令牌或继续使用相同的令牌。无论需要什么,都可以在不刷新页面的情况下完成。
于 2011-09-25T15:36:29.987 回答
1

尝试使用 offline_access 权限获取令牌。

于 2011-09-21T11:53:51.370 回答
1

我想,猜这是不可能的,FB架构不允许这样做。为什么offline_access 会出现这样的问题!!!!!!...反正offline_access 是我猜的最佳解决方案....

于 2011-09-23T14:08:10.663 回答
1

你有没有想过使用ajax?两小时后,您将检查用户是否仍处于活动状态。如果是这样,您将 axax 请求发送到 URL,他的会话详细信息将在其中更新。例子:

$(document).ready(function(){
    setInterval('update_session()', 5500000);
})
update_session(){
    $.post({
        URL: ..., // script to update session on server
        data:{ /* username, password */ },
    })
}

并且服务器端只从帖子中获取用户名和密码,或者运行重新登录。

于 2011-09-16T19:06:58.357 回答
0

我假设您正在使用 iframesigned_request参数来获取您的访问令牌。实现所需的一种方法是使用 oAuth 2.0 获取访问令牌的方法。一开始时间更长;您的服务器和 Facebook 必须交换可能很慢的凭据,但这意味着您将获得一个code可以定期交换访问令牌的凭据,这意味着您的服务器可以定期维护会话(可能来自客户端的 ajax 调用) . 然后,您会将这个新的 access_token 传递给客户端,并在您的对话调用中使用它来处理您的请求(礼物)。

希望有帮助。

斯帕比

于 2011-09-22T10:24:52.563 回答
0

不幸的是,我认为这在设计上是不可能的(如果您的意思是在没有用户干预的情况下发生)。如果用户仍然登录到 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 是否仍然有效的地方使用显示的代码,然后再继续。

于 2011-09-19T09:16:03.077 回答
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 

这将为您提供具有新到期时间的新令牌(应该是 60 天,但我注意到类似此处描述的错误https://developers.facebook.com/bugs/347831145255847/?browse=search_4f5b6e51b18170786854060

于 2012-03-12T16:35:48.033 回答
0

如果您获得 access_token 而不指定任何到期时间,它们将不会到期.. 至少直到用户更改他的 Fb 凭据或取消注册您的应用程序..

于 2011-09-22T08:30:40.940 回答