我正在尝试使用Facebook JS SDK将用户从Facebook注销,但是请致电:
FB.logout(function(response){
console.log(response);
});
返回: response.status ==“connected”
只有在刷新页面后,SDK才会意识到会话已经结束。有谁知道这可能导致什么行为?此代码以前在我的应用程序中工作,并且最近开始以这种方式运行。
使用FireBug的另一个例子:
答案 0 :(得分:14)
https://developers.facebook.com/bugs/245362365535898?browse=search_4f112135664703a96454690 这是JS SDK中的一个错误,现在已经修复了,它应该推迟不会太久 在此之前,您可以执行以下操作
FB.logout(function(response) {
FB.Auth.setAuthResponse(null, 'unknown');
...
});
答案 1 :(得分:3)
请参阅http://hustoknow.blogspot.com/2012/01/dealing-with-zombie-facebook-cookies.html
当您注销时,会向Facebook发送跨域请求以使会话无效。当你点击重新加载时,另一个请求被发送到Facebook的网站 - 因为FB认为cookie无效,它会正确地从你的浏览器中删除cookie。
我怀疑这是他们忘记解析最近一天左右推出的fbm_ cookie的一个正则表达式错误。我很惊讶没有推出这个修复程序。
答案 2 :(得分:3)
FB.logout(function(response) {
...
});
此FB.logout方法正常工作。 问题是用户试图从localhost调用它,这是无效的。
请尝试从服务器调用它。
答案 3 :(得分:2)
由于我花了很多时间来准确查找FB注销中发生的情况,因此最好在此处与他人共享。
第一件事,请阅读文档here
一个人登录Facebook,然后登录到您的应用程序。从您的应用程序注销后,该人仍将登录Facebook。
这一点杀死了我90%的时间。当我从facebook.com登录并尝试测试我的应用程序中的登录按钮时,它按预期工作,但注销并未终止会话。
解决方案或解决方案:根据文档中提供的方案,它不会终止用户会话,因为登录是从应用程序中未启动,是从facebook.com中。因此在这种情况下,fb不会终止会话。
当您从应用程序登录fb时(以用户名和密码重新登录),系统将会话的源/触发器视为您的应用程序。因此,当您注销(window.FB.logout或FB.logout)时,它将完全终止用户会话。
因此,请先从facebook.com中注销,然后再测试应用程序中的登录功能。
如前所述,请使用以下代码注销
FB.logout(function(response) {
// response from logout will have authResponse with access_token so better to test the status as it will return "unknown"
if(response.status !== "connected") { } \\ do some check on the status of the login before considering successful logout.
});
最后但并非最不重要:要从本地主机进行测试,请更新FB APP中的设置
这将解决从本地主机进行测试时遇到的问题
答案 4 :(得分:1)
我对FB.Logout()
的工作方式与广告宣传不同。作为一种解决方法,我使用下面的javascript函数来检查用户是否已登录,如果是,则使用要加载的后续页面的URL及其访问令牌重定向到https://www.facebook.com/logout.php:
function reallylogout() {
FB.getLoginStatus(function (response) {
if (response.authResponse) {
window.location = "https://www.facebook.com/logout.php?next=" +
'URL to redirect to' +
"&access_token=" + response.authResponse.accessToken;
} else {
$("#loginButtonDiv").show();
$("#logoutButtonDiv").hide();
}
});
}
show / hide位只是jQuery来显示或隐藏其中有登录和注销按钮的div。注销按钮的onclick会触发reallyLogout()函数。
这适用于我的应用。
答案 5 :(得分:1)
我遇到过类似的问题。我在Logout之后使用了FB.getLoginStatus()
。
答案 6 :(得分:0)
它在Facebook上显得破碎。在FB rell上你可以登录,但是注销功能什么都不做。 http://www.fbrell.com/auth/all-in-one
答案 7 :(得分:0)
好的,我找到了解决方案:
为此注销<a>
标记设置onClick事件
onclick="FB.logout(function() { document.location.reload(); });"
所有在一起:
<a href="#"
id="auth-logoutlink"
style="float:left;font-size: small;"
onclick="FB.logout(function() { document.location.reload(); });">
[logout]
</a>
答案 8 :(得分:0)
在asp.net mvc应用程序中我做了以下。
<a href="javascript:void(0);" class="logOff">Log out</a>
$(function () {
$(".logOff").click(function () {
//check if logout is
FB.getLoginStatus(function (response) {
console.log('inside login status');
if (response.status === 'connected') {
// the user is logged in and has authenticated your
// app, and response.authResponse supplies
// the user's ID, a valid access token, a signed
// request, and the time the access token
// and signed request each expire
var uid = response.authResponse.userID;
var accessToken = response.authResponse.accessToken;
FB.logout(function (response) {
FB.Auth.setAuthResponse(null, 'unknown');
});
} else if (response.status === 'not_authorized') {
// the user is logged in to Facebook,
// but has not authenticated your app
} else {
// the user isn't logged in to Facebook.
console.log('response status not logged in');
}
});
window.location.href = '@Url.Action("LogOff", "Account")';
});
答案 9 :(得分:-1)
它可能不起作用,因为您不包含您的Facebook应用程序密钥。它对我有用:
Ext.get('auth-logoutlink').on('click', function(){
FB.getLoginStatus(function (response) {
if (response.authResponse) {
window.location = "https://www.facebook.com/logout.php?confirm=1&api_key=**MYAPIKEY**&next=" +
'**MYWEBSITEURL**' +
"&access_token=" + response.authResponse.accessToken;
} else {
//HIDE **LOGOUT BUTTON**
//SHOW **LOGIN BUTTON**
}
});
});