amazon-web-services - 在前端 javascript 中存储 aws cognito JWT key 不安全吗?

标签 amazon-web-services security aws-lambda aws-cognito cognito

我正在查看网站的 javascript 文件以找到我想要的端点,在此期间我发现了这样的一行。

DASHBOARD_API_Token=eyJraWQiOiJVS2paTnB3SWdBK292QzB3RWdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


当我解码上面的 JWT 时,我发现了像 child 、用户名、用户邮箱、iss = http://cognito-idp.us-east-1.amazonaws.com/ 这样的实体。 {池 ID}

我已经阅读了一些亚马逊资源,这些资源表明可以使用上述 token 获取 aws 凭据。鉴于我只有 jwt token ,有什么可能,我是否必须联系网站来撤销当前的 token ?

最佳答案

好吧,就其 JWT token 以及您可以使用它们做什么而言,AWS Cognito 是一个非常有趣的野兽。

首先,当您根据 Cognito 用户池对用户进行身份验证时,您会获得 3 个不同的 token :AccessToken , IdToken , 和 RefreshToken .两个AccessTokenIdToken有效期为 1 小时(您无法更改)。这就是为什么你会得到 RefreshToken ,您可以使用它来获得新的 AccessTokenIdToken例如,通过调用 InitiateAuth . RefreshToken默认情况下有效期为 30 天,但您可以在 Cognito 用户池的设置中更改它。

访问 token

这是 Cognito 提供的最强大的 token 。如果您拥有有效的 AccessToken ,您可以调用几个非常敏感的 Cognito API。

一个非常令人惊讶的例子是您可以调用 DeleteUser API 通过提供 AccessToken它将从 Cognito 用户池中完全删除您的帐户。这里“最好”的一点是,如果你有一个有效的 AccessToken,应用程序开发人员就无法阻止你这样做。 . AWS 开发人员是 saying “它的设计”。这是我们决定不将 Cognito 访问 token 传递到应用程序前端的最重要原因之一。

说到 AccessToken 的有效载荷,唯一可能敏感的声明是 client_id ,其中包含用于对用户进行身份验证的 Cognito 客户端 ID。如果这个客户端没有客户端密码(这可能首先应该被认为是一个安全漏洞),那么 client_id可用于调用相当广泛的 Cognito API。但是,Cognito 认为 client_id成为公共(public)信息。所有其他声明都被视为公开,您可以查看声明的完整列表 here .

身份 token

包含有关播放器的信息。它可能包含有关玩家的一些个人信息,具体取决于您在 Cognito 用户池中配置的标准声明和自定义属性,但是也可以使用 Pre Token Generation Lambda Trigger 禁止或覆盖这些声明.使用此触发器可以隐藏或屏蔽玩家属性,这些属性被认为是敏感的,不应出现在 IdToken 中。 .

据我所知,您不能使用 IdToken调用 Cognito API。

刷新 token

只能用于请求新的AccessTokenIdToken , 不能用于调用 Cognito API。在我们的特定用例中,我们必须避免传递 RefreshToken到应用程序前端,因为它可以用来获取 AccessToken反对公共(public) Cognito API(这意味着我们不能阻止用户这样做)。

使用 Cognito token 获取 AWS 凭证

仅当 Cognito 用户池已与 Cognito 身份池显式集成(假设应用程序开发人员知道他们在做什么)时,这才有可能。当您交换 Cognito JWT token 时,您会获得临时 AWS 凭证,其权限绑定(bind)到在 Cognito 身份池中配置的特定 IAM 角色。这是完全合法的流程和预期的行为。此外,如果 Cognito 身份池配置为允许未经身份验证的访问,您甚至可以在没有 Cognito JWT token 的情况下获得临时 AWS 凭证(但这些凭证将绑定(bind)到另一个可能更具限制性的 IAM 角色)。

将 Cognito token 与 API 网关一起使用

AWS API Gateway 资源可以是 integrated使用 Cognito 用户池。根据集成的完成方式,您可以使用 AccessTokenIdToken来自集成的 Cognito 用户池。

撤销 token

您可以通过调用 GlobalSignOut 撤销在 Cognito 用户池中为您的帐户发行的所有代币。 API 并提供有效的 AccessToken .由于此 API 是公开的,如果您拥有有效的 AccessToken,则无需联系网站。 .

关于amazon-web-services - 在前端 javascript 中存储 aws cognito JWT key 不安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50509709/

相关文章:

browser - 您可以创建符合HIPAA要求的Amazon S3 Web应用程序吗?

amazon-web-services - 等待命令时超时 : "sam local invoke"

node.js - 未设置 AWS Lambda 环境变量, Node 中未定义 process.env

java - 使用 GSON 解析整个 AWS SQS 记录

linux - 在亚马逊服务器上执行 bash 时出现错误 [错误 : spawn EACCES], bash 在正确的路径中

security - Zend 形式的随机数

Linux/etc/hosts 内容

java - 基于 JSF JDBC 领域表单的身份验证搜索(按用户名和电子邮件地址)

spring-boot - Swagger 使用 Spring Boot 和 AWS Lambda

Node.js 代码可以在本地运行,但不能在 AWS Lambda 上运行