3

随着 Facebook在 5 月 1 日弃用离线访问权限,Web 应用程序可以轻松延长 OAuth 访问令牌的持续时间(60 天)。

但是,如果应用程序在 Web 上并且想要提供“切换用户”选项,通常是注销 -> 登录,那么访问令牌将失效,并且完全无法替代 offline_access。

问题:有没有办法保留有效的访问令牌(60 天),但仍然允许注销或多个用户在单个浏览器上登录,或者在请求登录时“强制登录提示”(Facebook 提供 Switch user on the登录页面)?

还是鼓励我们不再提供注销选项?

4

2 回答 2

1

我运行了一些测试,看起来无论我如何获取访问令牌、服务器端流或客户端流,即使我有两个令牌(来自两个流),当我调用FB.logout()时(我假设这就是您注销用户的方式)所有令牌都将失效。

在我看来,你必须选择你喜欢的功能,切换用户或长期有效的令牌,除非我当然错过了一些东西。

但是,我可以为您提供一个解决方法,它并不理想,因为大多数解决方法,但它可能让您享受两个世界:在您的 UI 中,您可以让用户选择注销以切换用户,只需告诉他手动注销 facebook,然后当他单击您的注销时,只需在不使用FB.logout的情况下将他从您的系统中注销。这样,您为该用户拥有的访问令牌不会失效,并且其他用户将能够登录。

于 2012-04-09T16:59:41.143 回答
1

出于安全原因,这可能不起作用,但是您是否尝试过在不指定访问令牌的情况下构建注销 URL?也就是说,例如:

  • 如果您使用的是 PHP SDK,请编写您自己的getLogoutUrl(...)方法版本,或者只传入一个空的 access_token,例如$facebook->getLogoutUrl(array('access_token' => ''));

  • 如果您使用的是 JS SDK,您将无法使用FB.logout(),这需要访问令牌。相反,您可以提供自己的:

FB.provide('UIServer.Methods', {
    'auth.logout': {
        url: 'logout.php',
        transform: function(a) {
            var xdRelation = FB.UIServer.getXdRelation(a.params);
            a.params.next = FB.UIServer._xdResult(a.cb, a.id, xdRelation, true);
            return a;
        }
    }
});

如果执行上述代码,理论上它应该改变 FB.logout 的行为,不再传递 access_token。公平警告:我自己没有测试过。否则,只需将用户发送到http://facebook.com/logout.php?next=SOME_URL并查看它是否在没有 access_token 的情况下工作。

于 2012-04-13T23:36:36.120 回答