typescript Cognito自定义电子邮件发件人-解密html实体

ecbunoof  于 2023-06-24  发布在  TypeScript
关注(0)|答案(1)|浏览(118)

我正在尝试为AWS Cognito设置自定义电子邮件发件人触发器。用户由子系统使用cognito的admin-create-user命令创建。这将触发一封带有初始一次性密码的电子邮件。90%的时间都在工作。
有时解密后的密码包含一个符号,该符号被表示为HTML实体,而Cognito则期望用户输入真实的的符号

lambda邮件发送方内部的解密值(发送给用户):

iPi1Hz>H(注意>部分)

正确密码:

iPi1Hz>H
我的lambda自定义电子邮件发件人的解密部分

const getPlainTextCode = async (event: CustomEmailSenderTriggerEvent) => {
  if (!event.request.code) {
    throw Error("Could not find code");
  }

  if (!process.env.KEY_ID) {
    throw Error("Cannot decrypt code");
  }

  const client = buildClient(CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT);
  const generatorKeyId = process.env.KEY_ALIAS;
  const keyIds = [process.env.KEY_ID];
  const keyring = new KmsKeyringNode({ generatorKeyId, keyIds });

  let plainTextCode: string | undefined = undefined;
  const decryptOutput = await client.decrypt(keyring, Buffer.from(event.request.code, "base64"));
  if (event.userPoolId !== decryptOutput.messageHeader.encryptionContext["userpool-id"]) {
    throw new Error("Encryption context does not match expected values!");
  }
  plainTextCode = decryptOutput.plaintext.toString(); // this outputs iPi1Hz>H

  return plainTextCode;
};
egmofgnx

egmofgnx1#

遇到了同样的问题,团队中的一个人使用一个取消解析保留字符的函数解决了这个问题,如下所示

function unescapeReservedCharacters(plainTextCode) {
   return plainTextCode
     .replace(/&/g, '&')
     .replace(/&lt;/g, '<')
     .replace(/&gt;/g, '>')
     .replace(/&#39;/g, "'")
     .replace(/&quot;/g, '"');
}

并在plainTextCode对象上使用,如下所示

let plainTextCode = undefined;
try {
  plainTextCode = await getPlainTextCode(event);
  plainTextCode = unescapeReservedCharacters(plainTextCode)
} catch (error) {
  throw Error(`Could not decrypt code: ${error}`);
}

学分:

相关问题