サーバー側で Facebook Cookie を処理して、Web アプリに Facebook 認証を実装しようとしています。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"/>
追加情報:
- これは、 --enable-file-cookies が設定されている場合と設定されていない場合の両方で、localhost と 127.0.0.1 の両方で、Chrome の安定版とカナリア版、および IE9 でテストされました (価値があるため)。つまり、ブラウザの問題ではないということです。
- チャネル ファイルをいじってみましたが、現在の場所では完全にアクセスできるようです。
- JS から自分のコードに Cookie を設定すると、本来のように機能します。
- ログイン ウィジェットが適切に装飾されているため、JS SDK は問題なく読み込まれます。
- コンソールにエラーは報告されません。完全に空白です。
- CoffeeScript をFacebook Developersの初期化コード JavaScript の例からのコピーに置き換えても、それは機能しません。
それで、何が起こっているのですか?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);