我按照railscast在我的站点中添加了“使用Facebook登录”功能,登录没有问题。但是当尝试注销时,即使我在 facebook 开发人员应用程序设置中禁用沙盒模式(如其他讨论中所建议的那样),FB.getLoginStatus 似乎也从未被触发:
(function() {
jQuery(function() {
$('body').prepend('<div id="fb-root"></div>');
return $.ajax({
url: "" + window.location.protocol + "//connect.facebook.net/en_US/all.js",
dataType: 'script',
cache: true
});
});
window.fbAsyncInit = function() {
FB.init({
appId: 'xxxxxomittedxxxxx',
cookie: true,
status: true,
xfbml: true,
oauth: true
});
$('#sign_in').click(function(e) {
e.preventDefault();
return FB.login(function(response) {
if (response.authResponse) {
return window.location = '/auth/facebook/callback';
}
});
});
return $('#sign_out').click(function(e) {
FB.getLoginStatus(function(response) {
if (response.authResponse) {
return FB.logout(response.authResponse);
}
});
return true;
});
};
}).call(this);
我知道 FB.getLoginStatus 永远不会进入(或不起作用)的原因是我将主体替换为:
FB.getLoginStatus(function(response) {
return alert("I am here!");
});
在“sign_out”点击时我看不到我的警报。
我正在运行具有相同行为的 Chrome 和 Firefox。任何人都可以帮助发现我错过了什么吗?非常感谢。
让我更具体地描述一下我遇到的“行为”:
- 第一次从 mysite.com 使用 Facebook 登录 Facebook 登录窗口会弹出并询问电子邮件和密码,我可以完美登录我的网站并按预期工作
- 然后我单击 mysite.com/users/1 中的 sign_out 按钮,看起来它可以注销。
- 然后再次从 mysite.com 使用 Facebook 登录,现在它不会再弹出 Facebook 登录窗口,直接登录 mysite.com/users/1 无需询问电子邮件和密码!
- 如果我打开另一个浏览器窗口并转到 facebook.com 并从那里注销,那么当我从 mysite.com 使用 Facebook 登录时,它现在会弹出一个 Facebook 登录窗口并询问我的电子邮件和密码。
我希望我的网站能够正常运行:“当从 mysite.com/users/n 注销并从 mysite.com 再次使用 Facebook 登录时,将弹出 Facebook 登录窗口”
任何人都可以提供帮助吗?非常感谢。
编辑:
进一步调查发现“根本”原因可能仍然是:退出是在登录路径的不同路径(或页面)下,而 FB.getLoginStatus 不能在 mysite.com/signout 下触发。来自 firebug 的错误消息表明“应用程序配置不允许给定 URL。:应用程序的设置不允许一个或多个给定 URL。它必须与网站 URL 或画布 URL 匹配,或者域必须是应用程序域之一的子域。”
为了证明这是路由问题,我在与登录路由相同的路由(页面)中放置了一个注销链接,这是“使用 Facebook 登录的网站”中指定的根路由 mysite.com,一切正常,可以注销为预期的:
<%= link_to "sign out facebook", "#" , id: "sign_out" %>
顺便说一句,sign_out js 被修改以摆脱 FB.logout(response.authResponse) uncaught [object Object] 错误,因为 FB.logout 期望函数作为参数:
return $('#sign_out').click(function(e) {
FB.getLoginStatus(function(response) {
if (response.authResponse) {
FB.logout();
}
}, true);
});
};
所以,底线:FB.getLoginStatus 可能仍然有一个错误,它无法处理来自与登录路由不同的路由的呼叫。(我使用 Chrome、Firefox 和 Safari 进行了测试,它们的行为都相同,但对于 IE10 而言并非如此。不知何故,IE10 甚至可以在不同的路径上退出。)
有类似问题的人有什么意见吗?请指教。非常感谢您提前。