【问题标题】:how to detect after FB authentication and before FB authorizationFB认证后FB授权前如何检测
【发布时间】:2013-12-19 19:52:47
【问题描述】:

在我的 MVC 应用程序中,我在 JQuery 中有以下代码来检查用户是否连接到 Facebook 应用程序

FB.login(function (response) {
    switch (response.status) {
        case "connected":
        case "unknown":
            break;
    }

}, { scope: "@MyPermissions" });

现在,当我通过我的应用程序进行 FB 登录时,它会进行身份验证并立即启动 FB 应用程序授权,最后在授权完成后进入 Connected 情况。

我的问题是:我可以检测 Facebook 身份验证何时完成以及授权开始之前吗?这样我的调试器就可以在授权发生之前捕获该位置。我实际上必须避免授权。

【问题讨论】:

标签: facebook-javascript-sdk


【解决方案1】:

实际上 oAuth 是两步授权,您不能在身份验证时停止它。

你可以做一个技巧,通常人们已经登录到 Facebook,因此你可以在第一次加载时尝试getLoginStatus(),这肯定会返回你not_authorized,因为它还没有授权你的应用程序,你可以执行你的检查他们,然后获得用户授权。

FB.getLoginStatus(function(response) {
  if (response.status === 'not_authorized') {
    // the user is logged in to Facebook, 
    // but has not authenticated your app


  } else {
    // the user isn't logged in to Facebook.
  }
 });

【讨论】:

  • 我认为这不应该获得自动赏金。没有指向源文档的链接,并且是从现有答案中复制的。
【解决方案2】:

编辑:这是你什么? Facebook account delink or deauthorize facebook app and check status of linking from facebook app

否则

首先,出于安全原因,Facebook 登录和应用程序身份验证是不可分割的。登录 Facebook 和通过应用程序登录 Facebook 是不同的。要从外部网站使用 Facebook 登录,您实际上是通过要求用户允许该应用访问其个人资料的某些部分的应用登录。

所以当用户点击登录时。首先,如果他们还没有登录 Facebook,他们将被要求登录。您可以在登录前使用 FB.getLoginStatus https://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus/ 进行检查

用户登录 Facebook 后,他们必须对您的应用进行身份验证,您才能访问他们的信息。也可以使用 FB.getLoginStatus 获得此信息

你需要一个 accessToken 来调用 api。当您运行登录对话框时,fb js sdk 会在内部存储它。因此,如果您不使用它登录。除非您自己构建,否则 api 调用将失败。

根据所提供的信息,我假设您希望避免在以前登录的用户每次访问该页面时都显示日志记录/身份验证对话框。这是我能想到的唯一一种情况,您可能会避免显示对话框。

在这种情况下,您可以使用 cookie 和访问令牌在页面访问期间保持登录状态。

在首次登录后使用 cookie 将 accessToken 存储在本地。然后对您的登录逻辑进行编码,以在加载或登录时检查和验证令牌。

除非 accessToekn 会话用完,否则返回站点的这种方式不会启动登录/身份验证对话框,但只会将用户状态更改为已登录。然后使用您的访问令牌构建您的图形 api 调用。

我使用https://graph.facebook.com/oauth/access_token_info 和参数client_id: APPID, access_token: token 来验证令牌。

如果令牌有效会话良好,则用户已登录并已授权应用程序。如果失败,cookie 会被删除,然后我会退出登录对话框。

还有一些您应该删除 cookie 的情况,例如 authResponseChange 或注销。

在那张纸条上;我相信您想要发布授权的是订阅 authResponseChange 事件https://developers.facebook.com/docs/facebook-login/login-flow-for-web/。这是一个内脏的实现:

FB.Event.subscribe('auth.authResponseChange', function(response) {
  if (response.authResponse) {
      if (response.status === 'connected') {
           // User logged in and User has authorized the app
      } 
      else if (response.status === 'not_authorized') {
           // User logged in but has not authorized app    
      }
      else {
          // User logged out                    
      }
  } else {
     // No valid authResponse found, user logged out or should be logged out             
  }
});

这里有更多的docohttps://developers.facebook.com/docs/reference/javascript/FB.Event.subscribe/

还有其他你可以利用的活动

auth.login - 当身份验证状态从未知变为已连接时触发

auth.authResponseChange - 当 authResponse 改变时触发

auth.statusChange - 当状态改变时触发(有关这意味着什么的更多信息,请参阅 FB.getLoginStatus)

【讨论】:

  • 如果没有更好的解释,我可以为您提供更多帮助。这将在 auth 之前和 auth 之后给出。真的有必要投反对票吗?
  • 真的是在auth之前和auth之后给...我的+1
  • @abcdefghi 你找到答案了吗?或者可以提供“建设性”反馈或这些解决方案?
【解决方案3】:

我自己还没有尝试过,但是查看文档中的 FB.getLoginStatus 页面会发现以下内容。

FB.getLoginStatus

FB.getLoginStatus 允许您确定用户是否登录到 Facebook 并已对您的应用进行身份验证。有三种可能 用户状态:

  1. 用户已登录 Facebook 并验证了您的应用程序 (connected)
  2. 用户已登录 Facebook,但尚未验证您的应用程序 (not_authorized)
  3. 用户此时未登录 Facebook,因此我们不知道他们是否已验证您的应用程序 (unknown)

如果我正确理解了您的问题,您可以查看status 中的not_authorized 案例,以防用户确实已登录但尚未授权您的应用程序。

p>

不过,请确保将此机箱放在 connected 机箱上方。

此外,即使您使用 FB.login 而不是 FB.getLoginStatus,这也应该可以工作,因为根据同一页面的以下引用,

所有这些事件返回的响应对象与 来自 FB.getLoginStatus、FB.login 或 FB.logout 的响应。这个回应 对象包含:

状态 用户的状态。 connectednot_authorized 之一或 unknown.

authResponse authResponse 对象。

返回的对象是一样的。

【讨论】:

  • "status 用户状态。已连接、未授权或未知之一" 这些与我的要求无关。
  • @abcdefghi,你能解释一下你的要求吗?尤其是在文档方面。
猜你喜欢
  • 1970-01-01
  • 2015-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多