实际上,我通过以下代码为未经身份验证的用户检索了签名的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);
});
如何检索公共密钥以验证签名?
我只能从用户池中找到有关令牌的文档。因为我想处理未经身份验证的用户,所以这对我没有帮助。
答案 0 :(得分:0)
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": "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"
}