in lib/ide-services-cognito.ts [35:137]
constructor(scope: Construct, id: string, props: IdeServicesCognitoProps) {
super(scope, id, props);
const deploymentUrl = props.deploymentUrl
// Get admin email from context
const adminUserEmail = this.node.getContext('adminUserEmail');
// Create Cognito User Pool
const userPool = new cognito.UserPool(this, 'IdeServicesUserPool', {
selfSignUpEnabled: false,
userVerification: {
emailSubject: 'Verify your email for IDE Services',
emailBody: 'Thanks for signing up to IDE Services! Your verification code is {####}',
emailStyle: cognito.VerificationEmailStyle.CODE,
},
autoVerify: {email: true},
standardAttributes: {
email: {
required: true,
mutable: true,
},
},
passwordPolicy: {
minLength: 8,
requireLowercase: true,
requireUppercase: true,
requireDigits: true,
requireSymbols: true,
},
accountRecovery: cognito.AccountRecovery.EMAIL_ONLY,
removalPolicy: cdk.RemovalPolicy.DESTROY,
});
const userPoolDomain = userPool.addDomain('CognitoDomain', {
cognitoDomain: {
domainPrefix: 'ide-services',
},
});
// Create Cognito User Pool Client with CloudFront domain
const userPoolClient = userPool.addClient('IdeServicesWebClient', {
authFlows: {
userPassword: true,
userSrp: true,
},
oAuth: {
flows: {
authorizationCodeGrant: true,
},
scopes: [
cognito.OAuthScope.EMAIL,
cognito.OAuthScope.OPENID,
cognito.OAuthScope.PROFILE,
],
callbackUrls: [
`${deploymentUrl}/api/login/authenticated`,
],
logoutUrls: [
`${deploymentUrl}`,
],
},
generateSecret: true
});
// Use AwsCustomResource to retrieve the client secret
const describeUserPoolClient = new cr.AwsCustomResource(this, 'DescribeUserPoolClient', {
onCreate: {
service: 'CognitoIdentityServiceProvider',
action: 'describeUserPoolClient',
parameters: {
UserPoolId: userPool.userPoolId,
ClientId: userPoolClient.userPoolClientId,
},
physicalResourceId: cr.PhysicalResourceId.of(userPoolClient.userPoolClientId),
},
policy: cr.AwsCustomResourcePolicy.fromSdkCalls({resources: cr.AwsCustomResourcePolicy.ANY_RESOURCE}),
});
// Create admin user
new cognito.CfnUserPoolUser(this, 'AdminUser', {
userPoolId: userPool.userPoolId,
username: adminUserEmail,
userAttributes: [
{
name: 'email',
value: adminUserEmail,
},
{
name: 'email_verified',
value: 'true',
},
],
});
this.config = new CognitoConfig(
userPool.userPoolId,
userPoolDomain.baseUrl(),
userPoolClient.userPoolClientId,
describeUserPoolClient.getResponseField('UserPoolClient.ClientSecret'),
adminUserEmail
)
}