我有一个使用Oauth 2与Facebook集成的应用程序。
我可以使用FB进行授权并完美地查询他们的REST和Graph API,但是当我授权使用FB创建活动的浏览器会话时。然后我可以很好地注销我的应用程序,但是与FB的会话仍然存在,所以如果其他人使用浏览器,他们将看到以前的用户FB帐户(除非之前的用户也手动注销了FB)。
我要授权的步骤是:
如果用户的浏览器还没有活动的FB会话,则此步骤将打开Facebook登录/连接窗口。一旦他们登录到Facebook,他们就会使用代码重定向到我的网站,我可以用它代替oauth令牌。
现在我有一个Oauth令牌,用户的浏览器登录到我的站点,然后登录到FB。
让我们说我的用户想要退出我的网站。 FB条款和条件要求我执行单点登录,因此当用户退出我的站点时,他们也会退出Facebook。有人认为这有点愚蠢,但如果有任何实际可行的方法,我很乐意遵守。
我见过以下建议:
一个。我使用Javascript API注销:FB.Connect.logout()。好吧,我尝试使用它,但它不起作用,我不确定它究竟是怎么做的,因为我没有在我的网站上以任何方式使用Javascript API。会话不是由Javascript API维护或创建的,所以我不确定它应该如何使它过期。
B中。使用[LINK:facebook.com/logout.php]。这是由Facebook论坛的管理员提出的。给出的示例与获取FB会话(非oauth)的旧方法有关,所以我认为我不能在我的情况下应用它。
℃。使用旧的REST api expireSession或revokeAuthorization。我尝试了这两种方法,虽然它们确实使Oauth令牌过期,但它们不会使浏览器当前使用的会话无效,因此它没有效果,用户也没有注销Facebook。
我真的有点松散,Facebook文档不完整,含糊不清,非常差。论坛上的支持是不存在的,目前我甚至无法登录到facebook论坛,除此之外,他们自己的FB Connect集成甚至不能在论坛本身上运行。没有太大的信心。
Ta可以提供任何帮助。 德里克
PS。不得不将HTTPS更改为LINK,没有足够的业力来发布可能足够公平的链接。
答案 0 :(得分:41)
我遇到了同样的问题。我也使用oauth登录(我正在使用RubyOnRails),但是对于注销,我使用JavaScript使用这样的链接来执行:
<a href="/logout" onclick="FB.logout();">Logout</a>
首先调用onclick
函数并在facebook上执行注销,然后调用我网站的正常/logout
函数。
虽然我更喜欢服务器端解决方案,但至少它做了我想要的,它会在两个网站上都记录下来。
我对Facebook集成的东西也很陌生并且第一次使用它,但我的总体感觉是文档遍布整个地方并且有很多过时的东西。
答案 1 :(得分:18)
此解决方案不再适用于FaceBook的当前API(似乎无意中开始使用)
http://m.facebook.com/logout.php?confirm=1&next=http://yoursitename.com;
尝试在您的注销链接或按钮“yoursitename.com”上提供此链接 在您注销后可能是您想要重定向到的主页。
有效..
答案 2 :(得分:18)
此作品现已发布 - 并且已在Facebook的网站@ http://developers.facebook.com/docs/authentication/上记录。不确定它最近是如何被添加到文档中的,当我在2012年2月检查时确定它不存在
您可以通过重定向以编程方式将用户登录Facebook
的用户https://www.facebook.com/logout.php?next=YOUR_REDIRECT_URL&access_token=USER_ACCESS_TOKEN
答案 3 :(得分:8)
我可以通过将用户重定向到
来以编程方式将用户注销Facebookhttps://www.facebook.com/logout.php?next=YOUR_REDIRECT_URL&access_token=USER_ACCESS_TOKEN
下一个参数中提供的URL必须是与应用程序设置中定义的应用程序具有相同基本域的URL。
答案 4 :(得分:5)
您可以使用access_token
:
$access_array = split("\|", $access_token);
$session_key = $access_array[1];
您可以使用PHP SDK中的$session key
生成功能注销URL。
$logoutUrl = $facebook->getLogoutUrl(array('next' => $logoutUrl, 'session_key' => $session_key));
这结束了浏览器的facebook会话。
答案 5 :(得分:1)
使用PHP我正在做:
<a href="?action=logout">logout.</a>
if(isset($_GET['action']) && $_GET['action'] === 'logout'){
$facebook->destroySession();
header(WHERE YOU WANT TO REDIRECT TO);
exit();
}
工作,现在只是想找到一个退出按钮图形,这很好,很容易!
答案 6 :(得分:1)
这是在API的当前(2.12)版本中使用的已接受答案的替代方法。
<a href="#" onclick="logoutFromFacebookAndRedirect('/logout')">Logout</a>
<script>
FB.init({
appId: '{your-app-id}',
cookie: true,
xfbml: true,
version: 'v2.12'
});
function logoutFromFacebookAndRedirect(redirectUrl) {
FB.getLoginStatus(function (response) {
if (response.status == 'connected')
FB.logout(function (response) {
window.location.href = redirectUrl;
});
else
window.location.href = redirectUrl;
});
}
</script>
答案 7 :(得分:0)
Sumit建议的移动解决方案适用于AS3 Air:
html.location = "http://m.facebook.com/logout.php?confirm=1&next=http://yoursitename.com"
答案 8 :(得分:0)
Christoph回答的一个注释: Facebook Oauth Logout 注销功能需要指定回调函数,否则将失败 它,至少在Firefox上。 Chrome无需回调即可运行。
FB.logout(function(response) {});
答案 9 :(得分:0)
目前我正在写这篇文章,m.facebook.com的技巧不再有效(至少对我而言),用户被重定向到移动FB登录页面,这显然不利于用户体验。
幸运的是,FB PHP SDK有一个semi-documented solution(如果链接不能导致getLogoutUrl()
功能,只需在该页面上搜索它)。 StackOverflow上至少还提到了这一点:Facebook php SDK getLogoutUrl() problem。
BTW我刚才注意到这个问题Zach Greenberg got it right,但我将我的答案添加为Python开发人员的摘要。
答案 10 :(得分:0)
@Christoph:只是添加一些东西。我不这么认为这是一个正确的方法。同时在两个地方注销。(<a href="/logout" onclick="FB.logout();">Logout</a>
)。
Just add id to the anchor tag . <a id='fbLogOut' href="/logout" onclick="FB.logout();">Logout</a>
$(document).ready(function(){
$('#fbLogOut').click(function(e){
e.preventDefault();
FB.logout(function(response) {
// user is now logged out
var url = $(this).attr('href');
window.location= url;
});
});});
答案 11 :(得分:0)
Update:
此解决方案有效且只调用'FB.logout()'不起作用,因为浏览器希望用户交互实际调用此函数,以便它知道 - 用户不是脚本。
<a href="#" onclick="FB.logout();">Logout</a>
答案 12 :(得分:-8)
这很简单,只需输入:$ facebook-&gt; setSession(null);注销