AWS Cognito 授权方错误 500 由于内部错误导致执行失败 - JWT 声明中的空值

AWS Cognito Authorizer Error 500 Execution failed due to an internal error - null value in JWT claim

我在使用 cognito 授权方时遇到问题并且 运行 没有测试选项(我能想到),所以想知道是否有人遇到过类似的问题。我搜索了论坛,之前的实例似乎与 AWS 事件有关,并且有 "resolved themselves"。我的问题已经持续一个多星期了。

我有 3 个使用 Terraform 构建的 Cognito 用户池(抱歉 Cloud Formation)并作为 API 网关中的 Cognito 授权者附加到不同的 REST API。我还有另外 3 个,几乎相同(名称除外)附加到另外 3 个 APIs.

如果我使用有效的 JWT,使用 AWS Amplify(或直接使用 Cognito API)获得并使用控制台测试授权方,使用 CLI 测试授权方或创建 API 在 auth 打开的情况下请求一个端点,我得到以下信息:

{
    "clientStatus": 500,
    "log": "Execution failed due to an internal error",
    "latency": 28
}

我已经打开 API 网关登录,但它提供的信息很少:

00:17:50 (63aac040-e610-11e8-a304-1dab6e773ddd) Extended Request Id: QOP7MG0ELPEFUBg=
00:17:50 (63aac040-e610-11e8-a304-1dab6e773ddd) Starting authorizer: x1rebc for request: 63aac040-e610-11e8-a304-1dab6e773ddd
00:17:50 (63aac040-e610-11e8-a304-1dab6e773ddd) Execution failed due to an internal error
00:17:50 (63aac040-e610-11e8-a304-1dab6e773ddd) Gateway response type: DEFAULT_5XX with status code: 500
00:17:50 (63aac040-e610-11e8-a304-1dab6e773ddd) Gateway response body: {"message":null}
00:17:50 (63aac040-e610-11e8-a304-1dab6e773ddd) Gateway response headers: {Access-Control-Allow-Origin=*, Access-Control-Allow-Headers=Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token, Access-Control-Allow-Methods=GET,OPTIONS}

如果我复制 Terraform 脚本并部署另一个用户池和授权方,然后将其附加到损坏的 API 端点,那么一切都很好。如果我附加已部署到损坏的 API 端点的其他 3 个授权者之一,那么一切都很好。

如果我将授权方从损坏的端点附加到另一个正在工作且已打开身份验证的 API 端点(在另一个与工作授权方一起工作的 API 中),那么 API 终点中断...所以这向我表明这是一个 Cognito 问题,而且我无法获得任何日志!

如果它几乎是任何其他 AWS 资源,我会将其打包、重新部署并重新开始。然而,了解这的根本原因对我来说非常重要,因为将生产用户池和所有用户及其详细信息合并在一起,这些无法导出或迁移(据我所知)并重新配置 Web 应用程序以使用无法静态映射的新 Cognito 应用程序和用户池 ID(据我所知)不是我想在生产环境中冒险的事情。

任何进一步的信息或指示将不胜感激!谢谢,

汤姆

如果有人遇到这个问题,我刚刚查清了问题的根源(几个月前就解决了这个问题)。

我在预令牌生成触发器中创建了一个具有空值的 JWT 声明,例如

{ "field": null }

Cognito 对此没有问题,并在您登录时发回令牌,并使用此空值完成。但是,当您使用它登录时,它会崩溃并给您一个神秘的 "internal error",没有任何详细信息。

更改为以下解决问题:

{ "field" "null" }

在我的例子中,由于在 cognito 用户池中定义的自定义属性的数据类型不匹配以及从预令牌生成器 lambda 添加时,我收到此错误。

在我的例子中,因为我使用的是 preTokenGenerationLambda 并且我正在执行 RDS 操作。我必须设置

context.callbackWaitsForEmptyEventLoop = false;

Doc 说:callbackWaitsForEmptyEventLoop – 设置为 false 以在回调 运行 时立即发送响应,而不是等待 Node.js 事件循环为空。如果这是错误的,任何未完成的事件将在下一次调用期间继续 运行。