我正在尝试在我们的网络应用程序中实现 Facebook 身份验证,并通过 Facebook cookie 的服务器端处理。我们使用 JavaScript SDK 来执行我们的登录并设置 cookie。
然而,不知何故,Facebook SDK 似乎没有设置我们的 fbsr_APPID cookie(或任何 cookie)。这是 CoffeeScript 代码:
window.fbCallbacks = []
# Create initialization function
window.fbAsyncInit = ->
fbConfig =
appId: '<APPID here>'
channelUrl: '/assets/channel.html'
status: true
cookie: true
xfbml: true
FB.init fbConfig
cb() for cb in window.fbCallbacks
# Set it up
((d)->
id = 'facebook-jssdk'
ref = d.getElementsByTagName('script')[0]
return if d.getElementById id
js = d.createElement 'script'
js.id = id
js.async = true
js.src = "//connect.facebook.net/en_US/all.js"
ref.parentNode.insertBefore js, ref
)(document)
我们让 Facebook 通过提供的登录小部件执行登录:
<div class="fb-login-button" data-show-faces="true" data-scope="publish_stream"/>
一些额外的信息:
- 这是在 Chrome 稳定版和金丝雀以及 IE9 中测试的,在 localhost 和 127.0.0.1 上,有和没有 --enable-file-cookies 集(对于它的价值)。我会说这意味着这不是浏览器问题。
- 我试过摆弄频道文件,但现在它似乎完全可以访问。
- 在我自己的 JS 代码中设置一个 cookie 就像它应该的那样工作。
- JS SDK 加载良好,因为我的登录小部件已正确装饰,甚至显示我已经登录。
- 控制台中不会报告任何错误。它完全是空白的。
- 用Facebook Developers上的初始化代码 JavaScript 示例中的副本替换 CoffeeScript也无法正常工作。
那么发生了什么?为什么 Facebook 不设置我的应用程序 cookie?
作为参考,这里是上面 CoffeeScript 生成的 JavaScript:
(function() {
window.fbCallbacks = [];
window.fbAsyncInit = function() {
var cb, fbConfig, _i, _len, _ref, _results;
fbConfig = {
appId: '<appid>',
channelUrl: '/assets/channel.html',
status: true,
cookie: true,
xfbml: true
};
FB.init(fbConfig);
_ref = window.fbCallbacks;
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
cb = _ref[_i];
_results.push(cb());
}
return _results;
};
(function(d) {
var id, js, ref;
id = 'facebook-jssdk';
ref = d.getElementsByTagName('script')[0];
if (d.getElementById(id)) {
return;
}
js = d.createElement('script');
js.id = id;
js.async = true;
js.src = "//connect.facebook.net/en_US/all.js";
return ref.parentNode.insertBefore(js, ref);
})(document);
}).call(this);