Parse.FacebookUtils.logIn 是不是只允许通过弹出框登录 Facebook?

Posted

技术标签:

【中文标题】Parse.FacebookUtils.logIn 是不是只允许通过弹出框登录 Facebook?【英文标题】:Does Parse.FacebookUtils.logIn only allow Facebook login via a pop up box?Parse.FacebookUtils.logIn 是否只允许通过弹出框登录 Facebook? 【发布时间】:2015-07-19 10:35:03 【问题描述】:

我正在尝试使用 parse.com Facebook SDK 来允许我的用户使用 Fb 登录按钮登录到我的网站。

我在桌面浏览器和 Safari 上运行良好,但 ios Chrome 存在一个已知问题,该问题会导致所讨论的错误 here。

我的调查使我得出结论,是 Parse.FacebookUtils.logInclass 导致 Facebook 弹出窗口打开,对吗?

如果是这样,是否可以将其作为页面打开而不是弹出窗口?这将避免上述错误。

我已经构建了一个适用于标准 Facebook 登录但不适用于 Parse 的解决方法。不确定是否可以使用它?这项工作的信息来自here。

我也看到了 Rahul here 的回答作为一个潜在的解决方案,但我不确定如何实施它

任何帮助都将不胜感激,因为我多年来一直坚持这一点。

function getUserData() 
    FB.api('/me', function(response) 
        document.getElementById('response').innerhtml = 'Hello ' + response.name;
    );


window.fbAsyncInit = function() 
    //SDK loaded, initialize it
    Parse.FacebookUtils.init(
        appId      : '12345',
        xfbml      : true,
        version    : 'v2.3'
    );


    //check user session and refresh it
    var uri = encodeURI('http://mysite123.com/user_home.html');
    FB.getLoginStatus(function(response) 
        if (response.status === 'connected') 
            //user is authorized
            document.getElementById('loginBtn').style.display = 'none';
            getUserData();

         else 
            //user is not authorized
        
    );
;

//load the javascript SDK
(function(d, s, id)
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) return;
    js = d.createElement(s); js.id = id;
    js.src = "//connect.facebook.net/en_US/all.js";
    fjs.parentNode.insertBefore(js, fjs);
(document, 'script', 'facebook-jssdk'));


//add event listener to login button
document.getElementById('loginBtn').addEventListener('click', function() 

var ABSOLUTE_URI = "http://mysite123.com/user_home.html";
var FB_ID = "12345";

  // Open your auth window containing FB auth page 
  // with forward URL to your Opened Window handler page (below)

  var redirect_uri = "&redirect_uri=" + ABSOLUTE_URI;
  var scope = "&scope=public_profile,email,user_friends";
  var url = "https://www.facebook.com/dialog/oauth?client_id=" + FB_ID + redirect_uri + scope;

  // notice the lack of other param in window.open
  // for some reason the opener is set to null
  // and the opened window can NOT reference it
  // if params are passed. #Chrome iOS Bug
  window.open(url);



function fbCompleteLogin()

Parse.FacebookUtils.logIn(null, 
  success: function(user) 
    if (!user.existed()) 
      alert("User signed up and logged in through Facebook!");
     else 
      alert("User logged in through Facebook!");
    
  ,
  error: function(user, error) 
    alert("User cancelled the Facebook login or did not fully authorize.");
  
);



function requireLogin(callback)

    FB.getLoginStatus(function(response) 
        if (response.status != "connected")
            showLogin();
        else
            checkAuth(response.authResponse.accessToken, response.authResponse.userID, function(success)

              // Check FB tokens against your API to make sure user is valid
            );
        
    );



, false);

【问题讨论】:

【参考方案1】:

我之前遇到过同样的问题,然后解决了。如果您不想弹出新窗口,请使用 OAuth 登录 facebook。

您可以使用parse-facebook-user-session 快速完成。之后,只需使用超链接 链接登录页面。也许你会遇到错误209 invalid session token。您只需在 Parse.com 仪表板设置页面上打开“需要可撤销会话”切换。

如果你还有一些问题,比如如何获取用户的access_token,我在my blog写了一些帖子,也许对你有帮助(对不起,帖子是繁体描述的)。

更新:

我创建了demo和GitHub,请检查。

【讨论】:

我要睡觉了(23:48 UTC+8)。如果明天有时间,我将发布一个简单的示例。 看起来很有希望 - 稍后会很好看,所以这使用嵌入的 javascript?是否需要对我的文件或解析后端进行任何其他设置才能使其正常工作?还是我只是将文件放到我现有的文件结构中? 它使用 node.js 作为 Parse 后端。要设置它,请参阅 GitHub 中的步骤。 好的,我可以设置云部分和应用程序并在我现有的 js 代码已经存储在我自己的服务器上运行它吗? 是的,请参阅this,您可以按照步骤在后端服务器中使用其他语言来执行此操作。【参考方案2】:

如果你想自己控制登录过程,你必须绕过一些 Parse 部分。 我的建议是使用可以自定义的 FB api 登录 Facebook。

之后,您将从 facebook 获得一个对象,其中包含一些信息,例如令牌、expireDate、...可以将该对象提供给 Parse.FacebookUtils.logIn 方法,以便将 Facebook 帐户链接到 Parse 帐户。

这是科尔多瓦的 sn-p,可能需要进行一些调整。

$cordovaFacebook.getLoginStatus().then(function(rep)
  console.log(JSON.stringify(rep));
  var expDate = new Date(new Date().getTime() + rep.authResponse.expiresIn * 1000 ).toISOString();
  var authData = 
    id: String(rep.authResponse.userID),
    access_token: rep.authResponse.accessToken,
    expiration_date: expDate
  
  return Parse.FacebookUtils.logIn(authData);
)

【讨论】:

以上是关于Parse.FacebookUtils.logIn 是不是只允许通过弹出框登录 Facebook?的主要内容,如果未能解决你的问题,请参考以下文章