Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Facebook JavaScript SDK在FB.login调用后未在chrome中设置访问令牌cookie_Javascript_Ruby On Rails_Facebook - Fatal编程技术网

Facebook JavaScript SDK在FB.login调用后未在chrome中设置访问令牌cookie

Facebook JavaScript SDK在FB.login调用后未在chrome中设置访问令牌cookie,javascript,ruby-on-rails,facebook,Javascript,Ruby On Rails,Facebook,我正在使用FacebookJavaScriptSDK为我的站点实现登录。我已经在Safari和Firefox上使用过了,但在Chrome上没有 调用FB.login方法后,我可以从Facebook检索访问令牌,但它没有像在Firefox和Safari中那样在cookie中设置访问令牌和用户ID。目前,我正在手动将访问令牌和用户ID写入Cookie,这样登录流就可以工作了,但它仍然让我感到恼火,因为访问令牌不是单独在Chrome中写入的 以前有没有人遇到过这个问题,并且知道如何解决?非常感谢 下面

我正在使用FacebookJavaScriptSDK为我的站点实现登录。我已经在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'});
  });
});

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

您可以在此处查看有关此行为的讨论:


(答案修改自)

请注意,JS SDK已经在fbsr\u APPIDcookie中存储了查看者的最新ID和访问令牌。每当用户使用
FB.ui
FB.login
FB.getLoginStatus
with
force=true
,或
FB.init
with
status:true
时,该cookie将使用最新数据进行更新

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