2012-07-18 120 views
0

我试图在我们的web应用程序中实现Facebook身份验证,服务器端处理Facebook cookie。我们使用JavaScript SDK来执行我们的登录并设置cookie。Facebook的JS 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,在本地主机和127.0.0.1上,有和没有--enable-file-cookies集(为了什么值得)。我想说这意味着它不是浏览器问题。
  • 我试过摆弄通道文件,但它现在似乎完全可以访问。
  • 从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); 

回答

0

看来我误解了SDK。登录按钮小部件实际上并未在本地设置cookie;它通过Facebook和JavaScript完全管理身份验证和访问,因此不允许您访问服务器上的身份验证令牌。

使用JS SDK的FB.login()函数确实设置了cookie。