最终答案是我没有从用户ID中删除Facebook_。因此,在理论上,我将我的Cognito电子邮件/密码链接到'Facebook_USERID'而不是'USERID'。
一旦我进行了更改,我就能够作为一个链接帐户进行身份验证。
var params = {
UserPoolId: 'YOUR_USER_POOL',
AttributesToGet: ['sub','email'],
Filter: "email = \"" + event.request.userAttributes.email + "\""
}
cognito.listUsers(params, (err, data) => {
if (err) {
console.log(err, err.stack);
}
else {
console.log(data);
console.log(event.userName);
if(data != null && data.Users != null && data.Users[0] != null)
{
console.log(data.Users[0].Username);
var params = {
DestinationUser: {
ProviderAttributeValue: data.Users[0].Username,
ProviderName: 'Cognito'
},
SourceUser: {
ProviderAttributeName: 'Cognito_Subject',
ProviderAttributeValue: event.userName.split("_")[1],
ProviderName: 'Facebook'
},
UserPoolId: 'YOUR_USER_POOL'
};
cognito.adminLinkProviderForUser(params, function(err, data) {
if (err) console.log(err, err.stack);
else console.log(data);
});
}
}
});
更新 - 2020年4月24日
我们为任何注册的用户添加了一个本地账户,以免遇到问题。他们只需要在尝试通过原生方式登录时激活/重置密码即可。以下脚本位于我们的 Pre-Sign Up 触发器 Lambda 函数中:
{
if (event.request.userAttributes.hasOwnProperty("email")) {
var params = {
ClientId: backendClientIds[event.userPoolId],
Password: generatePassword(),
Username: event.request.userAttributes.email
};
cognito.signUp(params, function(err, data) {
if (err) {
console.log('cognito.signUp:');
console.log(err, err.stack);
if(err.code === 'UsernameExistsException')
{
getUsersAndLink(event.userPoolId, event.request.userAttributes.email, event);
}
}
else {
console.log('cognito.signUp:');
console.log(data);
if(data.UserConfirmed)
{
linkUser(data.UserSub, event);
}
}
});
}
}
如果有帮助的话,这里是完整的Lambda代码:https://pastebin.com/4cyF9Nkw