首页 > 解决方案 > 在哪里可以检索 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);
});

如何检索公钥以验证签名?

我只能从用户池中找到涵盖令牌的文档。因为我想处理未经身份验证的用户,所以这对我没有帮助。

标签: javascriptamazon-web-servicesjwtamazon-cognito

解决方案


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"
}

推荐阅读