AWS Cognito Authorizer错误500由于内部错误-JWT声明中的null值,执行失败



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

我有3个Cognito用户池,使用Terraform(抱歉的云形成(构建,并作为API网关中的Cognito授权程序附加到不同的RESTAPI。我有另外3个,几乎相同(除了名称(附加到另外3个API。

如果我使用AWS Amplify(或直接使用Cognito API(获得的有效JWT,并使用控制台测试授权人,使用CLI测试授权人或在开启授权的情况下向端点发出API请求,我会得到以下信息:

{
    "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端点,那么一切都很好。如果我将其他3个授权者中的一个附加到已部署到损坏的API端点,那么一切都很好。

如果我将授权者从一个断开的端点连接到另一个正在工作并启用授权的API端点(在另一个与正在工作的授权者一起工作的API中(,那么API端点断开。。。所以这向我表明,这是一个Cognito问题,我无法获得任何日志!

如果它几乎是任何其他AWS资源,我会将其丢弃,重新部署并重新启动。然而,了解这一问题的根本原因对我来说非常重要,因为在生产环境中,我不想冒险对无法导出或迁移的生产用户池和所有用户及其详细信息进行装箱(据我所知(,并将web应用程序重新配置为使用新的Cognito应用程序和无法静态映射的用户池ID(据我了解(。

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

Tom

如果有人遇到这个问题,我刚刚弄清了问题的真相(几个月前就已经解决了(。

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

{ "field": null }

Cognito对此很满意,并在您登录时将令牌发回,并使用此null值完成。然而,当你用它登录时,它会掉下来,给你一个神秘的"内部错误",没有任何细节。

更改为以下内容可修复问题:

{ "field" "null" }

在我的例子中,我得到这个错误是因为在cognito用户池中定义的自定义属性的数据类型不匹配,并且是从预令牌生成器lambda添加的。

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

context.callbackWaitsForEmptyEventLoop = false;

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

我删除了预令牌生成器lambda并将其放回原处。

最新更新