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

Posted

技术标签:

【中文标题】由于内部错误,AWS Cognito 授权方错误 500 执行失败 - JWT 声明中的值为空【英文标题】:AWS Cognito Authorizer Error 500 Execution failed due to an internal error - null value in JWT claim 【发布时间】:2019-04-15 19:05:42 【问题描述】:

我遇到了 cognito 授权器的问题,并且已经用完了测试选项(我能想到的),所以想知道是否有人遇到过类似的问题。我搜索了论坛,以前的实例似乎与 AWS 事件有关并且已经“自行解决”。我的问题已经持续了一个多星期。

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

如果我采用使用 AWS Amplify(或直接使用 Cognito API)获得的有效 JWT,并使用控制台测试授权方、使用 CLI 测试授权方或向启用了身份验证的端点发出 API 请求,我得到以下信息:


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

我已启用 API Gateway 登录,但它提供的信息很少:

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(据我所知)不是我想在生产环境中冒险的事情。

非常感谢任何进一步的信息或指针!谢谢,

汤姆

【问题讨论】:

【参考方案1】:

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

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

"field": null

Cognito 对此很好,并在您登录时将令牌发回,并带有此空值。但是,当您使用它登录时,它会倒下并给您一个没有详细信息的神秘“内部错误”。

更改为以下内容可解决问题:

"field" "null"

【讨论】:

【参考方案2】:

在我的情况下,由于 cognito 用户池中定义的自定义属性的数据类型不匹配以及从 pre-token-generator lambda 添加时,我收到此错误。

【讨论】:

以上是关于由于内部错误,AWS Cognito 授权方错误 500 执行失败 - JWT 声明中的值为空的主要内容,如果未能解决你的问题,请参考以下文章

具有 Cognito 用户池授权方的 AWS SAM API

如何在 API 网关上的 cognito 授权方保护的 lambda 函数中获取 AWS Cognito 用户数据

使用 Lambda 授权方的 AWS Cognito 和 API 网关

AWS API Gateway + Cognito 用户池授权方 + Lambda - 我需要设置哪些 HTTP 标头和权限?

如何为 CORS 预检请求绕过 AWS API Gateway 代理资源上的 Cognito 授权方?

由于错误 AccessDeniedException(Lambda 别名作为 Cognito 触发器),AWS Cognito 用户池引发 PreSignUp 调用失败