在5月1日使用Facebook deprecating offline access permissions,网络应用程序可以轻松延长OAuth访问令牌的持续时间(60天)。
但如果该应用程序在网络上并且想要提供“切换用户”选项,则通常是注销 - >登录,然后访问令牌无效,并且对于offline_access完全无法替代。
问题:是否有办法保留有效的访问权限(60天),但仍然允许注销或多个用户在单个浏览器上登录或在请求时“强制登录提示”登录(Facebook在登录页面上提供Switch用户)?
或者我们是否鼓励不再提供退出选项?
答案 0 :(得分:1)
我运行了一些测试,看起来无论我如何获得访问令牌,服务器端流或客户端流,即使我有两个令牌(来自两个流),当我调用 FB.logout时()(我假设这是你记录用户的方式)所有令牌都会失效。
在我看来,你必须选择你喜欢的功能,切换用户或长期存在的有效令牌,除非我错过了什么。
然而,我可以为你提供一个解决方案,它并不理想,因为大多数工作都可以,但它可能会让你享受这两个世界: 在您的用户界面中,您可以为用户提供注销选项以便切换用户,只需告诉他手动退出Facebook,然后当他点击您的注销时,只需将他从系统中注销而不使用 FB .logout 。 这样,您为该用户拥有的访问令牌将不会失效,并且其他用户将能够登录。
答案 1 :(得分: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的情况下工作。