AWS Cognito - 使用 JWT 与 cognito.getUser 开发工具包验证令牌

Posted

技术标签:

【中文标题】AWS Cognito - 使用 JWT 与 cognito.getUser 开发工具包验证令牌【英文标题】:AWS Cognito - verify token using JWT vs cognito.getUser SDK 【发布时间】:2020-11-17 22:00:50 【问题描述】:

我正在使用 AWS 的以下文档来验证传入令牌与 Cognito 以验证 cognito 池中的用户: https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-verifying-a-jwt.html

现在我还需要验证该用户的自定义属性之一(电子邮件)。 (基本上,这是为了缓解某些用户可以在 API 有效负载中更改其电子邮件 ID 以访问其他人的详细信息的情况。

我发现的 Cognito SDK 是这样的:https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetUser.html

它工作得很好,但这让我想到了一个问题: 由于我在此 SDK 中发送访问令牌,是否还需要使用以前的基于 jwt 的令牌验证?因为此 SDK 还处理令牌无效/过期的情况并相应地发送错误代码。有没有我遗漏的东西,前一种情况处理而后一种情况没有?

【问题讨论】:

【参考方案1】:

简短回答:不,您可以忽略 JWT 的内容。

更长的答案:JWT 令牌提供了一种快速验证用户是否已通过身份验证的方法,而无需检查数据库或外部服务。这在大容量应用程序中可能非常重要。

但是,它们有几个限制:

颁发带有过期时间戳的 JWT 令牌。如果您依赖 JWT,则在该时间戳过期之前,您无法强制注销用户。 为了安全起见,您的 JWT 令牌必须使用非对称密钥对进行签名(我提到这一点只是因为很多人错误地实现了自己的身份服务器;Cognito 做得对。李> 令牌中的声明(并由身份服务器签名)可能不足以满足您的需求。最佳做法是最小化令牌的大小,iirc Cognito 遵循此做法,仅包含与身份验证直接相关的用户属性。

如果这些限制中的任何一个适用于特定用例(听起来第三个适用于您),那么您将不得不对该身份服务器进行外部服务调用。如果你这样做了,服务器会报告身份验证状态,那么就不需要关注令牌了。

【讨论】:

所以我是否正确地推断出一般来说 SDK 调用包含令牌的 Cognito 比自定义 jwt 身份验证更好地处理身份验证? 这是一个折衷方案:如果您依赖 JWT 代币,您不必回调 Cognito(这可能会增加 20-50 毫秒的处理时间),但您不能获取所有用户的信息。注意:此时是授权;身份验证已经发生。

以上是关于AWS Cognito - 使用 JWT 与 cognito.getUser 开发工具包验证令牌的主要内容,如果未能解决你的问题,请参考以下文章

为啥 AWS Cognito 对 JWT 使用多个公有密钥?

AWS Cognito 基于 JWT 属性的路由

AWS Cognito JWT 令牌验证

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

更改 AWS Cognito 访问令牌 JWT 中的加密算法

如何在 Go 中验证来自 AWS Cognito 的 JWT 令牌?