我直接使用来自Facebook文档的代码:https : //developers.facebook.com/docs/javascript/quickstart/
<body>
<script>
//this gets called immediately after sdk.js loads
window.fbAsyncInit = function() {
FB.init({
appId : '12345...MYIDHERE...6789',
autoLogAppEvents : true,
xfbml : true,
version : 'v5.0'
});
//check if user is logged in...
FB.getLoginStatus(function (response) {
console.log('initial-check:', response);
});
};
//check if user is logged in... - AFTER facebook Login Popup returns.
function callback_afterLogin() {
FB.getLoginStatus(function (response) {
console.log('callback_afterLogin:', response);
});
}
</script>
<script async defer src="https://connect.facebook.net/en_US/sdk.js"></script>
<div class="fb-login-button"
data-size="large"
data-button-type="login_with"
data-auto-logout-link="true"
onlogin="callback_afterLogin"
data-use-continue-as="false">
</div>
</body>
fb-login-按钮呈现为“注销”,这向我指示该按钮检测到我已登录Facebook以及应用程序本身。
问题是FB.getLoginStatus()response.status ==='未知'!为什么呢 我希望它显示为“已连接”。按钮清楚地知道我已连接,然后状态为何与此矛盾。
此外,我然后注销,该按钮更改为“使用Facebook登录”;然后我尝试重新登录,这显示了Facebook Popup窗口;输入正确的电子邮件/密码组合后,单击“登录”,我返回到我的应用程序页面,但打开登录回调函数(onlogin =“ callback_afterLogin”)两次!第一次,它显示正确的[状态:“已连接”],但是第二次它显示[状态:“未知”],使我看起来已经注销了。它应该没有理由发射两次?!
此外,还有一个源自facebook sdk.js的.toLowerCase()错误(请参阅第二个屏幕截图)。
您仍然可以将HTTP与“ localhost”地址一起使用,但前提是您的应用仍处于开发模式。
以上报价来自Facebook员工,网址为 https://developers.facebook.com/blog/post/2018/06/08/enforce-https-facebook-login/
我依靠它是真实的,但是显然它不应该被信任,并且是我的问题中记录的怪异行为的原因。
一旦我开始使用HTTPS(https:// localhost),sdk库就会表现得更好:
在两次触发两次回调之间会出现一个新的错误消息:
您正在覆盖当前的访问令牌,这意味着其他一些应用程序期望使用不同的访问令牌,并且您可能会破坏事情。请考虑将access_token直接传递给API参数,而不是覆盖全局设置。
我略微调整了代码,认为这样可以解决两次触发问题:
//check if user is logged in... - AFTER facebook Login Popup returns.
function callback_afterLogin(response) {
//REMOVED FB.getLoginStatus call, added `response` parm to callback signature
console.log('callback_afterLogin:', response );
}
但是它并没有改变,仍然连续触发两次,中间有错误消息。如果您知道为什么会触发两次,请发布您的解决方案。
还请注意,在某些情况下,.toLowerCase()错误仍然存在。
当我在开发中调用FB.getLoginStatus且当前站点访问者尚未连接到FB时,我也看到Facebook sdk代码发出.toLowerCase()javascript错误。疯!您找到解决方案了吗?我什至无法将异常捕获在try catch中,这显然是因为在我的try catch完全执行后,它正在异步发生。有小费吗?