首页 > 解决方案 > AWS cognito Json Web Token 和 Json Web Key

问题描述

我一直在使用 javascript SDK(使用 Amazon 的 GitHub 示例)在前端的 Angular 应用程序和后端的 .Net Core 应用程序中使用 AWS Cognito。我想知道的是,为什么我似乎无法发现有关访问令牌的所有重要信息似乎都是公开的。例如,用户池 ID、IdentityPoolId 和 ClientId 只是 javascript 中的变量,因此任何人都可以使用。有了这些变量,应该很容易获得 JWK,因为这是一个基于 clientid 和 userpool id 的公共亚马逊网页。这些密钥不应该是私有的吗?如果这些密钥是公开的,是不是可以模仿登录页面并窃取登录信息?

我尝试搜索诸如如何保护您的密钥和 JWK 之类的东西,但是当我这样做时,我只能得到有关如何签名和解密 access_tokens 的结果。

客户秘密

正如下面的答案建议使用客户端密码,我对此进行了调查。使用 javascript cognito sdk 时未使用客户端密码。在文档中,他们告诉您不要生成密钥,因为它不适用于 javascript sdk。这是因为它不会增加任何额外的安全性,因为应用程序在客户端运行,因此所有这些信息都是公开的。目前还不清楚所有这些客户端 ID/令牌的安全性,因为所有内容都可以在网上找到。

我的解决方案

如果 any1 对我的解决方案感兴趣,那就是:所以基本上我错过了使用 JWT 和 JWKS 是 JWK 只能用于验证 JWT 签名。无法使用 JWK 对令牌进行签名,在亚马逊的情况下,JWT 的签名是由 cognito 的 idp 中某处的证书完成的。因此,访问 JWK 并不是真正的安全问题。模仿登录页面并使用我的 cognito id 仍然是可能的,但还有其他方法可以增加安全性。

标签: amazon-web-servicesaccess-tokenamazon-cognitoaws-sdk-js

解决方案


在 AWS Cognito 上创建用户池应用程序客户端时,它们是生成客户端密钥的一个选项,客户端密钥用于将您的用户池保护到仅授权的应用程序(使用密钥的应用程序)。

客户端密码是 oauth 标准的一部分,您可以在此处了解更多信息

它与您的 ClientId 和 poolId 一起使用

var poolData = {
    UserPoolId : '...', // your user pool id here
    ClientId : '...' // your app client id here
    Secretkey: '...'// your app secret key here
};
var userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);

推荐阅读