Skip to content

Instantly share code, notes, and snippets.

@onhate
Last active February 28, 2024 03:33
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save onhate/67797decbb5a262786cea405f8bf29a1 to your computer and use it in GitHub Desktop.
Save onhate/67797decbb5a262786cea405f8bf29a1 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 cognito = new CognitoIdentityServiceProvider();
const knownProviderNames = {
google: 'Google',
facebook: 'Facebook'
};
const getProviderName = async (userPoolId: string, providerName: string) => {
if (knownProviderNames[providerName]) {
return knownProviderNames[providerName];
}
const { Providers } = await cognito.listIdentityProviders({ UserPoolId: userPoolId }).promise();
for (const provider of Providers) {
if (provider.ProviderName.toLowerCase() === providerName.toLowerCase()) {
return provider.ProviderName;
}
}
};
const tryMergeUserAccounts = async (event: PreSignUpTriggerEvent) => {
const { userPoolId, userName } = event;
const { email } = event.request.userAttributes;
const [provider, ...providerValues] = userName.split('_');
const providerValue = providerValues.join('_');
// merge social provider with existing cognito user by email
if (provider.length > 0 && providerValue.length > 0) {
const [{ Users }, providerName] = await Promise.all([
cognito
.listUsers({
UserPoolId: userPoolId,
AttributesToGet: ['email'],
Filter: `email = "${email}"`,
Limit: 1
})
.promise(),
getProviderName(userPoolId, provider)
]);
if (providerName && Users.length > 0) {
for (const user of Users) {
await cognito
.adminLinkProviderForUser({
UserPoolId: userPoolId,
DestinationUser: {
ProviderName: 'Cognito',
ProviderAttributeValue: user.Username
},
SourceUser: {
ProviderName: providerName,
ProviderAttributeName: 'Cognito_Subject',
ProviderAttributeValue: providerValue
}
})
.promise();
}
// return true to indicate users were merged
return true;
}
}
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);
};
@AsitDixit
Copy link

@onhate @Samrose-Ahmed @johnny68 @njeirath @coyksdev can any one provide code for js please

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment