Facebook API - 每个应用程序的不同用户ID?

时间:2015-01-22 10:58:10

标签: facebook oauth.io

我目前正在开发移动应用,因此我需要专门为此目的开发新应用。看起来愚蠢的是,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。以下是我使用基于网络的内容:

'id' => '838605583',

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

id  "10155167132970584"

两者都是完全相同的用户。

有没有办法将这些ID关联起来,所以我可以将它们匹配在一起?令人惊讶的是,Facebook并不认为这样的事情会成为一个问题!

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

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

  

当人们首次登录针对v2.0 API编写的应用实例时,Facebook将开始发布应用范围的用户ID。使用应用范围的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,所以没有办法将2连接在一起! Eugh

2 个答案:

答案 0 :(得分:10)

嗯,这是一个非常古老的消息。自2014年4月30日以来,它就是这样的。随着图API API v2.0的推出,FB还推出了专为您的用例设计的Business Mapping API。

您无法获得一个用户ID,但您会收到token_for_business

  

这将返回一个字符串,该字符串对于此人在同一个业务经理管理的所有应用中都是相同的。

答案 1 :(得分: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)
        });