11

我目前正在开发一个移动应用程序,因此我需要专门为此目的开发一个新应用程序。看起来很愚蠢的是,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 不同,因此无法将两者链接在一起!哎呀

4

2 回答 2

14

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

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

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

于 2015-01-22T11:27:36.957 回答
0
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)
        });
于 2017-10-28T07:39:08.587 回答