Facebook API-不同的用户ID';每个应用程序都有哪些功能?

Facebook API-不同的用户ID';每个应用程序都有哪些功能?,facebook,oauth.io,Facebook,Oauth.io,我目前正在开发一款移动应用程序,因此我需要一款专门用于此目的的新应用程序。看起来最愚蠢的事情是,Facebook决定对每个应用程序使用不同的“用户ID”。除了看不到这一点之外,我还对如何为给定的用户提取相同的用户ID以匹配我的数据库感到困惑。我正在使用oauth.io处理登录并返回值: $('#facebook-login').click(function() { $('#ajax_spinner_wrapper').show(); OAuth.initialize('CmRGY

我目前正在开发一款移动应用程序,因此我需要一款专门用于此目的的新应用程序。看起来最愚蠢的事情是,Facebook决定对每个应用程序使用不同的“用户ID”。除了看不到这一点之外,我还对如何为给定的用户提取相同的用户ID以匹配我的数据库感到困惑。我正在使用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()设置中使用另一个应用程序:

两者都适用于完全相同的用户

是否有某种方法将这些Id关联起来,以便我可以将它们匹配在一起?令人惊讶的是,Facebook竟然不认为这样的事情会成为一个问题

注意:来自Facebook的一些信息,关于这一变化:

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

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

如果您没有跨应用映射ID,则不需要更改代码。如果您需要在多个应用程序之间映射相同的用户ID或运行跨应用程序促销,我们添加了一个称为业务映射API的新API。这允许您在应用程序之间映射已登录用户的ID,只要这些应用程序都属于同一企业。了解有关实施交叉促销的更多信息

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

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

用户可以在应用程序的“编辑设置”对话框中检查已安装的每个应用程序的应用程序范围ID。确保你的应用程序用户在与你联系时知道如何找到它


我真的不明白他们的逻辑。为每个用户设置一个唯一的标识符更有意义,它可以用于根据任何数量的应用程序验证它。在我的例子中,有人登录到我们基于web的应用程序,然后他们也想登录到移动应用程序-但它有一个不同的用户ID,所以没有办法将2链接在一起!嗯

嗯,这是一个非常古老的消息。自2014年4月30日以来一直如此。随着graph API v2.0的引入,FB还引入了业务映射API,它是为您的用例而设计的

您不会收到一个用户id,但会收到一个用于业务的
令牌\u

这将在同一业务经理管理的所有应用程序中为此人返回相同的字符串


谢谢。我没有意识到这一点(我使用预先制作的插件进行基于web的登录,因此到目前为止还没有深入研究这一部分)。我会玩一玩,假设一切都能用——我会把这个标记为公认的答案:)作为一个补充说明,这样做的原因是反垃圾邮件和反滥用。共享FBUID意味着许多应用程序可以通过各种方式获取更多用户信息。这会使ID孤岛化,但对开发人员来说需要做更多的工作。我猜出于安全原因,他们使用的是唯一的用户ID。特别是在Javascript SDK中,如果每个应用程序使用相同的用户ID,那么注入已知的用户ID并访问用户帐户将非常容易。
id  "10155167132970584"
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)
        });