如果设置了cookie,Facebook登录Javascript SDK将自动登录

如果设置了cookie,Facebook登录Javascript SDK将自动登录,javascript,facebook,facebook-javascript-sdk,Javascript,Facebook,Facebook Javascript Sdk,我正在尝试设置我的网站,这样当你进入登录页面时,它会检查是否设置了cookie,如果设置了cookie,那么登录应该是自动的-即,当这个页面加载时,它会重定向到“Facebook.ashx”,这会创建一个cookie来记住访问令牌 但是,如果未设置cookie,则用户必须单击“使用Facebook登录”按钮继续登录,然后继续重定向到“Facebook.ashx”,如前所述 这是我的代码——目前它总是在用户接受应用程序并继续“Facebook.ashx”后登录 window.fbAsyninit

我正在尝试设置我的网站,这样当你进入登录页面时,它会检查是否设置了cookie,如果设置了cookie,那么登录应该是自动的-即,当这个页面加载时,它会重定向到“Facebook.ashx”,这会创建一个cookie来记住访问令牌

但是,如果未设置cookie,则用户必须单击“使用Facebook登录”按钮继续登录,然后继续重定向到“Facebook.ashx”,如前所述

这是我的代码——目前它总是在用户接受应用程序并继续“Facebook.ashx”后登录


window.fbAsyninit=函数(){
FB.init({
appId:'我的应用程序ID',//应用程序ID
状态:true,//检查登录状态
cookie:true,//启用cookie以允许服务器访问会话
xfbml:true//解析xfbml
});
//这里有额外的初始化代码
FB.Event.subscribe('auth.authResponseChange',函数(响应){
如果(response.status===“已连接”){
//用户已登录并已验证您的身份
//app和response.authResponse提供
//用户ID、有效访问令牌、签名
//请求,以及访问令牌的时间
//和签名的请求都将过期
var uid=response.authResponse.userID;
var accessToken=response.authResponse.accessToken;
//TODO:处理访问令牌
//向服务器发送帖子以完成登录
//这是一个表单帖子,因为我们不想使用AJAX
var form=document.createElement(“表单”);
var redirect=“FacebookLogin.ashx?redirect=“+document.getElementById('redirect').innerHTML;
form.setAttribute(“方法”,“post”);
form.setAttribute(“操作”,重定向);
var字段=document.createElement(“输入”);
field.setAttribute(“类型”、“隐藏”);
field.setAttribute(“名称”,“accessToken”);
field.setAttribute(“值”,accessToken);
表单。追加子项(字段);
文件.正文.附件(表格);
表单提交();
}else if(response.status===“未授权”){
//用户已登录到Facebook,
//但尚未验证您的应用程序
}否则{
//用户未登录到Facebook。
}
});
};
//异步加载SDK
(职能(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);
}(文件);
使用Facebook登录

感谢您提前提供的帮助。只要用户登录,每次加载页面时都会触发authResponseChange

您要做的是将“已知状态”从服务器传递到客户端,然后在
FB.getLoginStatus
中进行比较。如果状态发生了更改(如userID),那么这将构成一个真正的登录,您将重定向到ashx页面以设置新的cookie

举个简单的例子:

  • 第一步-加载页面,刷新空状态(userID=0)
  • 第二步-执行FB.getLoginStatus,比较authResponse.userID和userID
  • 第三步-自authResponse.userID 0起,重定向到设置cookie的页面
  • 第四步-加载页面,刷新状态(userID=authResponse.userID中的userID)
  • 第五步-执行FB.getLoginStatus,比较authResponse.userID和userID,因为它们匹配,所以不执行任何操作

我解决了-简单修复

如果您将状态更改为false而不是true,那么它将等待用户单击login并检查cookie是否存在,只需一个简单的If语句即可将状态更改为true或false,如下所示:

if (document.cookie.indexOf("fb_token") > 0) //user has already logged in with facebook - process should be automatic
        var fb_status = true;
    else
        var fb_status = false;
    window.fbAsyncInit = function () {
        FB.init({
            appId: 'My App ID', // App ID
            status: fb_status, // check login status
            cookie: true, // enable cookies to allow the server to access the session
            xfbml: true  // parse XFBML
        });

auth.authResponseChange
将在每次页面加载时启动,只要用户登录-您可能想订阅登录事件。感谢您的响应,但我的主要问题是我希望它等待用户单击“使用facebook登录”按钮,然后再继续,但是由于某些原因,它没有等待用户单击我已经尝试将代码更改为FB.login(函数(响应){if(响应.authResponse){//代码的其余部分与以前一样,但仍在自动继续。如何让它等待响应?感谢当您具有
状态:true
时,auth事件将始终自动触发,因为FB将尝试在后台解析状态。删除它,一切都会好起来。
if (document.cookie.indexOf("fb_token") > 0) //user has already logged in with facebook - process should be automatic
        var fb_status = true;
    else
        var fb_status = false;
    window.fbAsyncInit = function () {
        FB.init({
            appId: 'My App ID', // App ID
            status: fb_status, // check login status
            cookie: true, // enable cookies to allow the server to access the session
            xfbml: true  // parse XFBML
        });