如何解密Amazon Cognito触发器中的加密验证码codeParameter?
核心原因
你拿不到可解密的验证码、看到codeParameter值为{####},本质是配错了Cognito触发器类型:
- 你当前绑定的是普通
CustomMessage触发器,这个触发器的设计逻辑就是只给你传模板占位符:codeParameter固定是{####}、linkParameter固定是{##Click Here##},作用是让你拼接自定义邮件/短信模板,等你返回模板内容后,Cognito会自动把这些占位符替换成真实的验证码、验证链接,这个触发器全程不会透传真实验证码(不管是明文还是密文),你拿这个占位符去解密必然失败。 - 官方文档里提到的携带加密验证码
code字段的,是独立的Custom Email Sender(自定义邮件发送器) / Custom SMS Sender(自定义短信发送器) 触发器,和CustomMessage是完全不同的两个触发器,字段结构、触发逻辑、权限要求都不一样。
正确实现方案
根据你的实际需求选对应方案即可:
方案1:仅需存储验证码、不需要自定义邮件发送链路
普通CustomMessage触发器本身就不支持获取原始验证码,这是Cognito的默认安全设计,避免验证码在业务逻辑中泄露。如果只是需要留存验证码,不要尝试从触发器里取:直接在你业务侧的注册接口里生成、存储自有验证码,再调用Cognito的管理员验证接口完成用户码校验即可。
方案2:需要自行解密Cognito下发的加密验证码(比如自定义发信逻辑)
必须先调整触发器配置,再走解密逻辑:
- 进入Cognito用户池的触发器配置页,移除当前
CustomMessage触发器的绑定,改为给Custom email sender触发器绑定你的Lambda函数,同时按控制台提示给Cognito授予对应KMS密钥的使用权限,Cognito会用这个KMS密钥加密验证码后再传给Lambda。 - 配置完成后,触发器收到的请求结构里不会再出现
codeParameter字段,会在request节点下直接返回code字段,该字段是base64编码的验证码密文。 - 把你原有解密逻辑的入参从
codeParameter替换为request.code,转成字节数组后传入解密方法即可,解密逻辑本身不需要修改:const { plaintext, messageHeader } = await decrypt( keyring, b64.toByteArray(request.code), ); // plaintext就是解密后的明文验证码
注意:解密使用的keyring必须和配置Custom Sender时指定的KMS密钥严格对应,否则会解密失败。
内容的提问来源于stack exchange,提问作者Hulubina
相关产品推荐
相关产品推荐

