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

问题描述

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

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

如果我采用有效的 JWT,使用 AWS Amplify(或直接使用 Cognito API)获得,并使用控制台测试授权方,使用 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(据我所知)不是我想在生产环境中冒险的事情。

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

汤姆

标签: aws-api-gatewayamazon-cognitoterraformterraform-provider-aws

解决方案


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

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

{ "field": null }

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

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

{ "field" "null" }


推荐阅读