Skip to content

Instantly share code, notes, and snippets.

@coyksdev
Forked from onhate/pre-signup.ts
Created September 29, 2021 23:44
Show Gist options
  • Save coyksdev/d6b3a0bb5bf681abed8a2d68814671c5 to your computer and use it in GitHub Desktop.
Save coyksdev/d6b3a0bb5bf681abed8a2d68814671c5 to your computer and use it in GitHub Desktop.
Merge AWS Cognito External Provider User with Cognito User on Pre SignUp
import { PreSignUpTriggerEvent, PreSignUpTriggerHandler } from 'aws-lambda';
import { CognitoIdentityServiceProvider } from 'aws-sdk';
const providerName = {
google: 'Google',
facebook: 'Facebook'
};
const tryMergeUserAccounts = async (event: PreSignUpTriggerEvent) => {
const { userPoolId, userName } = event;
const { email } = event.request.userAttributes;
const [provider, providerValue] = userName.split('_');
// merge social provider with existing cognito user by email
if (['facebook', 'google'].includes(provider) && providerValue) {
const cognito = new CognitoIdentityServiceProvider();
const { Users } = await cognito
.listUsers({
UserPoolId: userPoolId,
AttributesToGet: ['email'],
Filter: `email = "${email}"`
})
.promise();
for (const user of Users) {
await cognito
.adminLinkProviderForUser({
UserPoolId: userPoolId,
DestinationUser: {
ProviderName: 'Cognito',
ProviderAttributeValue: user.Username
},
SourceUser: {
ProviderName: providerName[provider],
ProviderAttributeName: 'Cognito_Subject',
ProviderAttributeValue: providerValue
}
})
.promise();
}
// return true to indicate users were merged
return Users.length > 0;
}
return false;
};
export const handler: PreSignUpTriggerHandler = async (event, _, callback) => {
// continue the flow only if did not link providers
const wereUsersMerged = await tryMergeUserAccounts(event);
return wereUsersMerged ? undefined : callback(null, event);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment