使用有效的Facebook App调用FB.getLoginStatus时,响应状态始终未知。确切的回答是{authResponse:undefined,status:“unknown”}。
<html>
<body>
<div id="fb-root"></div>
<script>
window.fbAsyncInit = function(){
FB.init({ appId:'1484134468466778', status:true, cookie:true, xfbml:true});
FB.getLoginStatus(function(response){
console.log(response);
});
};
(function(d){
var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
js = d.createElement('script'); js.id = id; js.async = true;
js.src = "//connect.facebook.net/en_US/all.js";
d.getElementsByTagName('head')[0].appendChild(js);
}(document));
</script>
</body>
</html>
示例网址: http://media.tuentifotos.com/simple_test.html
这是Facebook App Settings的屏幕截图。
答案 0 :(得分:16)
我在Chrome中发生这种情况,原因是Chrome配置为阻止第三方Cookie和数据。
一旦我更改了配置,FaceBook就可以毫无问题地将我登录到我的应用程序。
答案 1 :(得分:5)
我在Chrome中也遇到过这个问题。但是,在Firefox中,当用户之前登录时,它按预期工作,状态返回为connected
。
我从类似问题here的答案中找到了关于此的线索。
此问题的根本原因是,在FB.logout()
上,Chrome未删除以某种方式影响fblo_<your-app-id>
函数以返回FB.getLoginStatus()
unknown
修复:在调用FB.logout()
时,您可以通过编程方式删除Cookie fblo_<your-app-id>
FB.logout(function(response) {
deleteCookie("fblo_" + fbAppId); // fblo_yourFBAppId. example: fblo_444499089231295
});
function deleteCookie(name) {
document.cookie = name +'=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';
}
答案 2 :(得分:4)
对我而言,这意味着“在我的登录页面上”我需要指定cookie。
window.fbAsyncInit = function() {
FB.init({
version: 'v2.8',
cookie : true,
});
};
但不要问我为什么就是这种情况。它还修复了它需要在登录按钮上单击两次才能实际登录,甚至不需要appId,貌似,FWIW ......
答案 3 :(得分:3)
当我选中时,状态显示为"not_authorized"
,这没关系,因为我还没有授权该应用。
要完成此流程,只要用户ID未获得授权或未登录到Facebook,就应添加FB.login
:
window.fbAsyncInit = function(){
FB.init({ appId:'{APP-ID}', status:true, cookie:true, xfbml:true});
FB.getLoginStatus(function(response){
if (response.status === 'connected') {
//proceed
} else if (response.status === 'not_authorized') {
login();
} else {
login();
}
});
};
function login(){
FB.login(function(response) {
if (response.authResponse) {
// proceed
} else {
// not auth / cancelled the login!
}
});
}
答案 4 :(得分:1)
我一直在发生这种情况,直到我打开浏览器以允许第三方网站保存和读取Cookie。
为此请转到
settings > advanced > site settings > Cookies and site data
答案 5 :(得分:1)
你只需要让你的网站 URL 从 http 到 https
不要使用http
答案 6 :(得分:0)
我在IE中遇到了同样的问题。弗利奇的回答让我思考。我尝试以管理员身份运行IE,但它确实有用。
答案 7 :(得分:0)
我遇到了同样的问题,我通过清除所有缓存和cookie来修复此问题。
答案 8 :(得分:0)
好吧,我想我终于找到了该死的问题。
您需要了解的内容:
1)您通过应用程序ID向Facebook进行身份验证。这将设置各种cookie,并在最后标记您的应用ID:
2)如果删除这些Cookie,您仍将以普通用户身份验证到Facebook (除非您完全注销)。并且他们在Facebook的服务器上仍然知道您已获得此应用的授权。
FB.getLoginStatus()
时,它将重新创建它们并将其重新放回。这不是您的用户所期望的。这是不好的。他们点击了“退出”。用户没有登录Facebook或明确退出了您的应用程序,因此它不会尝试连接到Facebook,因此,我们不知道他们是否已对您的应用程序进行身份验证。 (未知)
因此,他们甚至不尝试检查此cookie是否已设置。这就是为什么您会得到null或未定义的原因。因此fblo
Cookie被视为“选择退出”。 您并未真正退出任何普通人认为退出的含义。 当然,如果用户使用登录按钮重新登录,则该cookie将被删除,这就是您和您的用户想要的。
因此,我认为唯一有意义的事情(如果您确实需要了解用户的状态)是:
fblo_<APPID>
之前,手动检查FB.getLoginStatus
cookie的存在。1)选项1
绝对不做任何事情。现在,您已经了解了该问题,知道了不删除cookie,也许除了显示Facebook登录按钮外,您无需执行其他任何操作。
2)选项2
您假定此人是您应用程序的用户,并执行显示UI所需的所有操作。但是您将无法运行完全正常的逻辑-这将是针对您的应用程序。
3)选项3
fblo_<APPID>
设置为n
(而不是'y')。请记住,此Cookie是在您的域上设置的,因此您可以对其进行更改。 *根据您的开发环境,这会有所不同,但是需要在客户端完成,并且您可能需要指定`/'的路径和cookie域。getLoginStatus(..., true)
-现在不会阻止它,因为cookie现在是n
。但是,您一定不要在此处运行常规逻辑-因为您要做的就是检查用户是否实际上是Facebook用户和/或仍通过您的应用程序进行了身份验证。 y
不幸的是,由于奇怪的比赛条件,我不推荐这种解决方案。它几乎可以用,但是FB可能随时有意或无意间破坏了它-实际上,最终结果仍然令人困惑当您不在时,您实际上已经登录。另外,它甚至可能与我从未观察到的其他插件产生各种并发症。
我希望getLoginStatus
能够始终运行并提供准确的信息,但这是我看到的唯一真正的解决方案。这样已经有8年了,所以我认为我们坚持了下去。
4)选项4-设置自己的Cookie
顺便说一句,我重新访问了此问题,因为我正在为网站使用Messenger插件,除非我知道此人拥有一个Facebook帐户,否则我根本不希望它显示。因此,我需要对登录状态做出准确的答复。
答案 9 :(得分:0)
您必须从实时域(您在应用程序中提供的)中进行测试。
在本地(使用本地域)进行测试时,我遇到了同样的问题。
答案 10 :(得分:0)
在我的情况下,我使用的是Brave浏览器,该浏览器由于其状态未知而不允许使用cookie。我切换到chrome,现在可以使用了。