如何在FB认证之后和FB授权之前检测

时间:2013-12-19 19:52:48

标签: facebook-javascript-sdk

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

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

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

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

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

3 个答案:

答案 0 :(得分:2)

实际上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.
  }
 });

答案 1 :(得分:0)

编辑:这就是你的意思吗? Facebook account delink or deauthorize facebook app and check status of linking from facebook app

否则

首先,出于安全考虑,Facebook登录和app auth是不可分割的。登录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。然后编写您的登录逻辑以检查并在加载或登录时验证令牌。

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

我使用带有参数https://graph.facebook.com/oauth/access_token_info的{​​{1}}来验证令牌。

如果令牌有效会话良好,用户已登录并已授权该应用。如果失败,则删除cookie并点击登录对话框。

还有一些情况需要删除cookie,例如authResponseChange或注销。

就此而言;我相信你想要发布授权的是订阅authResponseChange事件https://developers.facebook.com/docs/facebook-login/login-flow-for-web/。这是一个内部实施:

client_id: APPID, access_token: token

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

还有其他事件可以利用

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

auth.authResponseChange - 在authResponse更改时触发

auth.statusChange - 状态发生变化时触发(有关此含义的其他信息,请参阅FB.getLoginStatus)

答案 2 :(得分:-1)

我没有为自己试过这个,但是通过文档中的FB.getLoginStatus页面查看建议如下。

  

FB.getLoginStatus

     

FB.getLoginStatus允许您确定用户是否已登录   Facebook并已验证您的应用程序。有三种可能   用户的状态:

     
      
  1. 用户已登录Facebook并已对您的应用程序进行身份验证(connected
  2.   
  3. 用户已登录Facebook,但未对您的应用程序进行身份验证(not_authorized
  4.   
  5. 此时用户未登录Facebook,因此我们不知道他们是否已对您的应用进行了身份验证(unknown
  6.   

如果我正确理解了您的问题,您可以检查status是否有not_authorized这样的案例可以让您突破,以防用户确实已登录但未授权您的申请爱好。

请确保将此案例置于connected案例之上。

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

  

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

     

状态用户的状态。其中一个connectednot_authorized或   unknown

     

authResponse authResponse对象。

返回的对象是一样的。