根据https://developers.facebook.com/docs/reference/javascript/FB.logout/
方法FB.logout()将用户从您的网站中记录
这对后来调用FB。*函数意味着什么?
具体来说,我观察到即使对FB.logout的响应状态为" unknown",在注销完成后,调用FB.getLoginStatus返回状态为&#34 ; connect",将true作为第二个参数传递或在页面刷新后传递。
这对我来说是意料之外的......也许我误解了用户将用户从您的网站中删除的内容"意思是:就FB。*功能而言,它意味着什么?我希望尽可能地扭转FB.login
的过程。怎么办呢?
更新:我正在http://localhost:8080进行测试。当在http://fbtest.charemza.name/上时,我意识到注销按预期工作,但注销localhost:8080注销不似乎有效,即表现出上述问题。要清楚,控制台中任何时候都不会出现错误。该页面的代码如下。
要稍微更改问题,为什么在localhost:8080上执行此操作,是否有办法在本地开发注销,其行为与公共网络上的行为相同?
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Facebook Test</title>
</head>
<body>
<script>
window.fbAsyncInit = function() {
FB.init({
appId : '1524395480985654',
cookie : true,
xfbml : false,
status : false,
version : 'v2.10'
});
FB.AppEvents.logPageView();
};
(function(d, s, id){
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) {return;}
js = d.createElement(s); js.id = id;
js.src = "https://connect.facebook.net/en_US/sdk.js";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
document.addEventListener("DOMContentLoaded", function(event) {
document.getElementById("loginButton").addEventListener("click", function() {
FB.login(function(response) {
console.log('FB.login', response);
});
});
document.getElementById("logoutButton").addEventListener("click", function() {
FB.logout(function(response) {
console.log('FB.logout', response);
});
});
document.getElementById("getLoginStatusButton").addEventListener("click", function() {
FB.getLoginStatus(function(response) {
console.log('FB.getLoginStatus', response);
}, true);
});
});
</script>
<button id="loginButton">FB.login()</button>
<button id="logoutButton">FB.logout()</button>
<button id="getLoginStatusButton">FB.checkLoginStatus()</button>
</body>
</html>
答案 0 :(得分:3)
这在localhost上不起作用的原因是您已将应用域设置为localhost
,只有在使用实际域时才应设置应用域。
所以我在FB JSSDK加载的Javascript上进行了调试会话,发现在
行下面document.cookie = n + "=" + o + (o && p === 0 ? "" : "; expires=" + r) + "; path=/" + (q ? "; domain=" + j : "")
如果没有App domains
设置,则设置为q=null
和j=.localhost
。所以没有在cookie上设置域名,因此一切都很好。
当App domains
设置为localhost
,q=true
和j=.localhost
时。因此,当代码尝试设置域时,它使用类似下面的内容
&#34; fbsr_370363483399260 = q8i_dn0F22UweXRMNff0tf5WpfYOelZ0vsjtIKrDhzw.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI .... A4NTgwNzg1MzEwOTk5In0; expires =星期五,2017年10月13日14:00:01 GMT;路径= /;域= .localhost&#34;
这不适用于localhost,并且根本不允许设置cookie。 document.cookie不会设置任何与当前页面无关的cookie。但是如果我在控制台中覆盖j=localhost
,那么cookie就可以运行。这是您在本地测试时不应将App domain
设置为localhost
的原因
答案 1 :(得分:0)
方法FB.logout()将用户从您的站点中注销,在某些情况下 案例,Facebook。
这意味着:
步骤:用户未登录Facebook - &gt;登录您的应用
在FB.Logout上:用户将从您的应用和Facebook注销
步骤:用户未登录Facebook - &gt;登录其他应用。 - &GT;登录您的应用
在FB.Logout上:用户将从应用和Facebook注销
步骤:用户已登录Facebook - &gt;登录您的应用
在FB.Logout上:用户将从您的应用中注销,但不会从Facebook注销。
(注意:如果用户未登录Facebook,他/她将首先登录Facebook然后登录您的应用程序)
因此,在所有情况下,用户都必须使用facebook登录,因此当您使用FB.getLoginStatus时会发生以下情况:
用户登录Facebook,您的应用已通过身份验证。
FB.getLoginStatus返回已连接
用户登录Facebook但未对您的应用进行身份验证
FB.getLoginStatus返回 not_authorized
现在,如果用户退出Facebook或退出您的应用程序(这可能会导致从Facebook注销)。 (这似乎是你的情况) 因为在这种情况下,应用甚至没有尝试连接到Facebook,这就是为什么未知。
FB.getLoginStatus返回 unknown
编辑:
现在在第三种情况下,它总会返回未知,因为它甚至没有尝试连接到Facebook。因此,如果你传递强制true,它将尝试对Facebook进行ajax调用并返回状态(应该连接或未经授权)。
function getLoginStatus(cb, force) {
if (!Runtime.getClientID()) {
Log.warn('FB.getLoginStatus() called before calling FB.init().');
return;
}
if (cb) {
if (!force && loadState == 'loaded') {
cb({
status: Runtime.getLoginStatus(),
authResponse: getAuthResponse()
});
return;
} else {
Auth.subscribe('FB.loginStatus', cb);
}
}
if (!force && loadState == 'loading') {
return;
}
loadState = 'loading';
var lsCb = function lsCb(response) {
loadState = 'loaded';
Auth.inform('FB.loginStatus', response);
Auth.clearSubscribers('FB.loginStatus');
};
fetchLoginStatus(lsCb);
}
如果force为true,则从Facebook SDK获取的上述函数将fetchLoginStatus。