我目前正在开发移动应用,因此我需要专门为此目的开发新应用。看起来愚蠢的是,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
答案 0 :(得分:10)
您无法获得一个用户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)
});