【问题标题】:Facebook API - different user ID's for each app?Facebook API - 每个应用程序的不同用户 ID?
【发布时间】:2015-03-21 03:26:08
【问题描述】:

我目前正在开发一个移动应用程序,因此我需要专门为此目的开发一个新应用程序。看起来很愚蠢的是,Facebook 决定为每个应用程序使用不同的“用户 ID”。除了没有看到这一点之外,我对如何为给定用户提取相同的 userId 以将其与我的数据库匹配感到困惑。我正在使用 oauth.io 来处理登录,并返回值:

$('#facebook-login').click(function() {
    $('#ajax_spinner_wrapper').show();
    OAuth.initialize('CmRGYdnRMWM2ZrOb7M1Nf1_T57o');
    OAuth.popup('facebook').done(function(result) {
        //console.log(result)
        result.get('/me').done(function(data) {
            //todo with data
            console.log(data);

            $.post('https://steampunkjunkies.net/cgi-bin/mobi_login.cgi', { action: 'store_session', what: 'facebook', user: data.id }, function(result) {
                $('#ajax_spinner_wrapper').hide();
            });
        }).fail(function(err) {
            //todo with err
            console.log("Hit an error?");
        });


    })
    .fail(function (err) {
        alert("oops, we got an error!");
        console.log(err);
        $('#ajax_spinner_wrapper').hide();
    });

    return false;
});

但问题在于,它在每个应用程序中给了我完全不同的 ID。以下是我使用基于 Web 的版本获得的结果:

'id' => '838605583',

..然后在我的 oauth.io (https://oauth.io) 设置中使用其他应用程序:

id  "10155167132970584"

两者都针对完全相同的用户。

有什么方法可以关联这些 ID,以便我可以将它们匹配在一起?令人惊讶的是,Facebook 认为这样的事情不会成为问题!

注意:来自 Facebook 的一些关于此更改的信息:

https://developers.facebook.com/docs/apps/upgrading#upgrading_v2_0_user_ids

当人们首次登录您的应用程序实例时,Facebook 将开始发布应用程序范围的用户 ID,该实例是根据 API 的 v2.0 编码的。使用应用范围的 ID,同一用户的 ID 在应用之间会有所不同。

无论他们最初用于注册您的应用的版本是什么,已登录您应用的用户的 ID 都将保持不变。对于过去在任何时候登录过您的应用的任何人,此更改都是向后兼容的。

如果您不跨应用映射 ID,则不需要更改代码。如果您需要跨多个应用映射相同的用户 ID 或运行跨应用促销,我们添加了一个名为 Business Mapping API 的新 API。这使您可以跨应用映射登录用户的 ID,只要这些应用都归同一企业所有。详细了解如何实施交叉促销。

对于尚未登录您的应用的用户,用户 ID 可能会根据您调用的 API 版本而改变。在 API 的 v1.0 中,未登录您的应用的用户将通过其原始 Facebook 用户 ID 进行引用,而在 v2.0 中,他们将通过应用范围的 ID 进行引用。

我们添加了新的 API 端点,允许您标记和邀请不使用您的应用的朋友。这些 API 返回令牌,这些令牌可用于生成用于标记和邀请的自定义界面。这些令牌并不意味着可缓存,我们不保证在收到包含它们的 API 响应后 24 小时后它们会保持稳定。它们与未登录您的应用的用户的数据所使用的 ID 不同,也与应用范围的 ID 不同。

用户可以在应用的“编辑设置”对话框中检查他们已安装的每个应用的应用范围 ID。确保您应用的用户在联系您咨询支持问题时知道如何找到它

我真的不明白他们的逻辑。为每个用户设置一个唯一标识符更有意义,该标识符可用于针对任意数量的应用程序进行验证。在我的例子中,有人登录了我们基于 Web 的应用程序,然后他们也想登录移动应用程序 - 但它的用户 ID 不同,因此无法将两者链接在一起!哎呀

【问题讨论】:

  • 出于安全原因,我猜他们正在使用唯一的用户 ID。特别是对于 Javascript SDK,如果每个应用程序都使用相同的用户 ID,那么注入已知用户 ID 并访问人们的帐户将非常容易。

标签: facebook oauth.io


【解决方案1】:

嗯,这是很老的消息了。自 2014 年 4 月 30 日以来一直如此。随着图形 API v2.0 的推出,FB 还推出了专为您的用例设计的业务映射 API。

您不会收到一个用户ID,但您会收到token_for_business

这会返回一个字符串,该字符串对于此人在由同一 Business Manager 管理的所有应用程序中都是相同的。

【讨论】:

  • 谢谢。我不知道这一点(我为基于 Web 的登录使用了一个预制插件,因此到目前为止还没有深入研究这部分)。我会玩一下,假设一切正常 - 我会将其标记为已接受的答案:)
  • 附带说明,这样做的原因是反垃圾邮件和反滥用。共享的 FBUID 意味着许多应用程序可以通过各种方式获取有关用户的更多信息。这会隔离 ID,但对开发人员来说工作量更大。
【解决方案2】:
LoginManager.logInWithReadPermissions(['email']).then((result) => {
          if (result.isCancelled){
            //console.warn("Login is canceled");
          } else {
             AccessToken.getCurrentAccessToken().then((data) =>{
             const responseInfoCallback = (error, result) => {
                if (error) {

                } else {
                    //you can pick data.userID  and data.applicationID
                    //To getting unique id of user by application
                    //I think you can use (data.userId + data.applicationId) as the id
                    //For getting profile you can use result.name, result.id (it likes data.userId)
                    //Token is available in data.accessToken

                }
              }
              const infoRequest = new GraphRequest(
                '/me',
                {
                  accessToken: data.accessToken,
                  parameters: {
                    fields: {
                      string: 'email, name, gender, picture,cover, id'
                    }
                  }
                },
                responseInfoCallback
              );
              new GraphRequestManager().addRequest(infoRequest).start()
        })
          }
        }, (error) => {
          console.warn(error)
        });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多