FB.login 如果用户之前连接过应用程序,则区分成功登录和取消

Posted

技术标签:

【中文标题】FB.login 如果用户之前连接过应用程序,则区分成功登录和取消【英文标题】:FB.login distinguish successful login from cancel if the user connected the app before 【发布时间】:2019-03-15 15:15:53 【问题描述】:

我们有一个这样的 FB.login 调用:

FB.login(function (response) 
  if (response.status === 'connected') 
    responseFunction(response.authResponse.userID);
   else 
    responseFunction(null);
  
,  scope: requiredPermissions.concat(optionalPermissions).join(','), return_scopes: true );

如果用户尚未连接到应用程序,它会正确检测到取消登录。但是,如果用户在取消登录时已经连接,response 看起来像这样:

authResponse: 
  accessToken: "token",
  data_access_expiration_time: 1560437437,
  expiresIn: 86963,
  reauthorize_required_in: 7776000,
  signedRequest: "bababa",
  userID: "userid"
,
status: "connected"

几乎与成功的登录响应完全一样。幸运的是,如果登录已正确完成(由于return_scopes 选项),响应中还有一个grantedScopes 字段。然而,用它来区分这两者似乎不可靠和hacky。

有没有更好的办法?

提前谢谢你!

更新: 为什么不改用 FB.getLoginStatus?

对于上下文:在我的例子中,FB.login 用于被授予访问用户页面的权限。它本身并不用于将它们登录到应用程序中。

如果有人指出我的推理有误,我会很高兴。这里是:

    由于浏览器中的模式块,在 FB.getLoginStatus 之后立即调用 FB.login 是不可靠的。 FB.login 需要在点击处理程序中同步调用。 如果在显示调用 FB.login 的按钮之前调用,FB.getLoginStatus 结果可能并且将会过期。在点击按钮之前,用户可能并且将会在此特定页面上花费大量时间。

这就是按钮单击处理程序立即调用 FB.login 的原因。它有助于避免上述两个问题。

【问题讨论】:

您已经通过 fb 登录弹出窗口连接用户的用例是什么? samb12,我已将您问题的答案添加到 OP 不确定您要在这里解决什么实际问题。 “FB.login 用于被授予访问用户页面的权限” - 您是在谈论他们管理的 Facebook 页面,还是您应用中的某种“用户页面”? 04FS,我指的是他们的 Facebook 页面。我想说的是,对于某些用户来说,Facebook 登录会在很长一段时间内发生一次,而对于其他用户则永远不会。 【参考方案1】:

我最终使用grantedScopes 的存在作为响应作为完成登录的指示。

【讨论】:

以上是关于FB.login 如果用户之前连接过应用程序,则区分成功登录和取消的主要内容,如果未能解决你的问题,请参考以下文章

TP-link的路由器,怎么查看连接过哪些设备的历史记录.

Facebook FB.login 不会要求用户提供电子邮件权限?

Facebook Javascript SDK - Fb.login 在浏览器内置的 Facebook 上不起作用

FB.getLoginStatus - 无响应

如果启用了 oauth 2.0,fb:login-button 的注册 URL 参数将失败

Fb.Logout 功能不会注销用户