Open
Description
Environment information
System:
OS: Windows 11 10.0.22631
CPU: (22) x64 Intel(R) Core(TM) Ultra 7 155H
Memory: 11.66 GB / 31.53 GB
Binaries:
Node: 20.11.0 - C:\Program Files\nodejs\node.EXE
Yarn: 1.22.21 - ~\AppData\Roaming\npm\yarn.CMD
npm: 10.8.0 - ~\WebstormProjects\amplify-next-pages-template\node_modules\.bin\npm.CMD
pnpm: undefined - undefined
NPM Packages:
@aws-amplify/backend: 1.0.2
@aws-amplify/backend-cli: 1.0.3
aws-amplify: 6.2.0
aws-cdk: 2.140.0
aws-cdk-lib: 2.140.0
typescript: 5.4.5
AWS environment variables:
AWS_NODEJS_CONNECTION_REUSE_ENABLED = 1
AWS_SDK_LOAD_CONFIG = 1
AWS_STS_REGIONAL_ENDPOINTS = regional
No CDK environment variables
Description
these values are the defineAuth method's option attributes.
triggers?: Partial<Record<'createAuthChallenge' | 'customMessage' | 'defineAuthChallenge' | 'postAuthentication' | 'postConfirmation' | 'preAuthentication' | 'preSignUp' | 'preTokenGeneration' | 'userMigration' | 'verifyAuthChallengeResponse', ConstructFactory<...>>> | undefined
there is no custom sender lambda value.
To reach that requirement, i had to custom the userPool on a phase of amplify backend cdk
.
The sample code is here.
// backend.ts
const backend = defineBackend({
sendVerificationCodeFunction,
auth,
data,
storage
})
const { cfnUserPool } = backend.auth.resources.cfnResources
const existedSendVerificationCodeFunction = backend.sendVerificationCodeFunction.resources.lambda
existedSendVerificationCodeFunction.grantInvoke(
new aws_iam.ServicePrincipal('cognito-idp.amazonaws.com')
)
const key = aws_kms.Key.fromKeyArn(
cfnUserPool,
`${KeyId}`,
`${KeyArn}`
)
key.grantDecrypt(existedSendVerificationCodeFunction)
cfnUserPool.addPropertyOverride('LambdaConfig', {
CustomSMSSender: {
LambdaArn: existedSendVerificationCodeFunction.functionArn,
LambdaVersion: 'V1_0'
},
KMSKeyID: key.keyArn
})
and this is the function's handler code
// handler.ts
export const handler = async (event: CustomSMSSenderTriggerEvent) => {
try {
const { decrypt } = buildClient(CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT)
const generatorKeyId: string = `${KeyAlias}`
const keyIds: string[] = [`${KeyArn}`]
const keyringInput: KmsKeyringNodeInput = { generatorKeyId, keyIds }
const keyring = new KmsKeyringNode(keyringInput)
const request = parseEvent(event)
console.log('Request:', JSON.stringify(request, null, 2))
let plainTextCode: string | undefined
if (request.code) {
const { plaintext, messageHeader } = await decrypt(keyring, b64.toByteArray(request.code))
plainTextCode = plaintext.toString('utf-8')
}
// do something with that plainTextCode
return {
statusCode: 200,
headers: {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': '*'
},
body: JSON.stringify({ success: true })
}
} catch (error) {
console.error('Error sending message:', error)
return {
statusCode: 500,
headers: {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': '*'
},
body: JSON.stringify({ success: false })
}
}
}
I hope the amplify backend
supply this feature officially