javascript - 在哪里可以检索 Cognito 身份池的公钥?
问题描述
实际上,我通过以下代码为未经身份验证的用户检索了签名的 JWT。
AWS.config.region = 'eu-central-1'; // Region
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: 'eu-central-1:cccccc-cccc-cccc-cccc',
RoleArn: 'arn:aws:iam::iiiiiiiiiiiii:role/Cognito_MyIdentityPoolUnauth_Role'
});
// Obtain Open ID Token (JWT)
AWS.config.credentials.get(function() {
console.log(AWS.config.credentials.params.WebIdentityToken);
});
如何检索公钥以验证签名?
我只能从用户池中找到涵盖令牌的文档。因为我想处理未经身份验证的用户,所以这对我没有帮助。
解决方案
AWS 文档仅描述了如何检索用户池的公钥,但也有身份池的公钥。虽然用户池公钥 ( https://cognito-idp.region.amazonaws.com/userPoolId/.well-known/jwks.json )的URL包含用户池 ID,但身份池的 URL 不包含。
可以从https://cognito-identity.amazonaws.com/.well-known/jwks_uri检索 Cognito 身份池的公钥。这为跨区域的所有可能的身份池提供了公钥。
要识别正确的密钥,您必须检查 Open Id Token 标头。属性kid 标识密钥列表中的正确密钥。
{
"kid": "eu-central-11",
"typ": "JWS",
"alg": "RS512"
}
例如,在这种情况下,正确的 jwk 将是:
{
kty: "RSA",
alg: "RS512",
use: "sig",
kid: "eu-central-11",
n: "AL9Kz62JHMpn5kBEqyoaXkM56x3l3Wi0kg0Juv71QtXo5M4ZJYxouKdcrKfevYTRNm6DE0hTbJnyj7Bh4EYbmruGdSWE970xkcFJxcgak0j4rneRX5G1E/xN27M42OOLmZCe8O6l3nksD0XGOqBPqOSEP3pYCNAYMncpSGnit56fUX+yszfMjGP3DVSUFZKtXbqwt/S0VpBi5BQbbD57R8DKenQsPfln91tgGopmXP66vZ4yWRUzs/mqHxcez3FcgHHXc6AbEJ6GOSVd9t+BCUW5kVY0aYO301PJczvB3zfsI6qebjS6BFTvMp8SqK532ZRnXEMgs/5gc9cfxpDsgvk=",
e: "AQAB"
}
推荐阅读
- ngrx - @ngrx/store 要求安装 @angular/core@^10.0.0 但是我们有 "@angular/core": "^11.0.5"
- migration - 尝试将问题从 JIRA 导入到 Redmine
- python - 拆分功能的python替代解决方案
- php - 组装菜单(节点树),其中只有父节点是已知的
- shell - 如何在 UNIX shell 脚本中引用通用脚本中的变量和文件中的变量名
- python - 在python中将一个列表分成两个单独的列表
- excel - 在 Excel 的单元格 C1 中,如何从单元格 B1 的逗号分隔值列表中选择未在 A 列中以逗号分隔的单元格/值?
- python - 如何使用 NLP 从 PDF 文件中提取关键字及其页码?
- c - 如何使用缓冲区溢出攻击找到要利用的程序的漏洞
- grails - 更新行时变音符号出错