4

我正在使用 Facebook JavaScript SDK 为我的网站实现登录。我已经让它在 Safari 和 Firefox 上运行,但不能在 Chrome 上运行。

调用 FB.login 方法后,我可以从 Facebook 检索访问令牌,但它不像在 Firefox 和 Safari 中那样在 cookie 中设置访问令牌和用户 ID。目前,我正在手动将访问令牌和用户 ID 写入 cookie,以便登录流程正常工作,但它仍然让我很吃惊,因为访问令牌不是单独用 Chrome 编写的。

有没有人遇到过这个并且知道手头的修复?非常感激。

下面是我的初始化和登录逻辑代码:

window.fbAsyncInit = function() {
  FB.init({
    appId      : "#{AppConfig.facebook['app_id']}", // App ID
    status     : true, // check login status
    cookie     : true, // enable cookies to allow the server to access the session
    xfbml      : true  // parse XFBML
  });

  // Additional initialization code here
};

// Load the SDK Asynchronously
(function(d){
   var js, 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";
   ref.parentNode.insertBefore(js, ref);
 }(document));

$(function() {
  $(".fb-login-button").click(function() {
    FB.login(function(response) {
      if (response.authResponse) {
        console.log("Welcome! Fetching your information...");
        $.cookie("user_id", response.authResponse.userID);
        $.cookie("access_token", response.authResponse.accessToken);
        window.location = "#{oauth_facebook_callback_url}";
      } else {
        console.log("User cancelled login or did not fully authorize.");
      }
    }, {scope: 'publish_stream,offline_access,email,user_events,create_event,user_location'});
  });
});
4

2 回答 2

19

如果您在本地测试您的应用程序,请注意 Google Chrome支持本地文件(包括localhost)的 cookie,除非您使用--enable-file-cookies标志启动它。但是,如果您使用本地 IP 地址(<code>127.0.0.1)进行测试,Chrome 确实支持 cookie。

您可以在此处查看有关此行为的讨论:http ://code.google.com/p/chromium/issues/detail?id=535

(答案修改自为什么 Chrome 会忽略本地 jQuery cookie?

于 2012-04-10T01:26:57.330 回答
1

请注意,JS SDK 已经将查看者的最新 ID 和 access_token 存储在fbsr_APPID cookie 中。每次用户使用FB.uiFB.loginFB.getLoginStatuswithforce = trueFB.initwith时,该 cookie 都会更新为最新数据status: true

我强烈建议使用此方法而不是存储您自己的 cookie,因为它是使用您的应用程序的密钥签名的,就像signed_request参数一样。您应该按照那里的说明进行解码,验证签名,如果它有效,请使用它。这将防止伪造(但仍可能无法防止短期重放攻击)。

于 2012-04-13T23:12:44.820 回答