Этот пост в блоге AWS подробно объясняет решение.
Идентификационный токен и токен доступа, сгенерированные Amazon Cognito, являются JWT.Cognito использует две пары ключей RSA для генерации этих токенов.Закрытый ключ каждой пары используется для подписи токенов.Открытые ключи могут быть использованы для проверки токенов.Эти открытые ключи доступны по адресу
https://cognito -idp. {REGION} .amazonaws.com / {YOUR_USER_POOL_ID} /. Всем хорошо известно / jwks.json
Используя Key ID из этого пути, вам нужно получить открытый ключ.Используя этот открытый ключ, вы можете проверить токены.
Ниже приведен фрагмент кода NodeJS для реализации вышеуказанной логики.Полный пример можно увидеть на этот коммит
const jwt = require('jsonwebtoken'); // JS Lib used to verify JWTs
const jwksClient = require('jwks-rsa'); // JS Lib to get keys from a URL
const USER_POOL_ID = "<YOUR_USER_POOL_ID>";
const CLIENT_ID = "<YOUR_CLIENT_ID>";
const REGION = "<YOUR_REGION>";
const ISSUER_URI = "https://cognito-idp." + REGION + ".amazonaws.com/" + USER_POOL_ID;
const JWKS_URI = ISSUER_URI + "/.well-known/jwks.json";
// Generate a client to read keys from the Cognito public URL
let client = jwksClient({
jwksUri: JWKS_URI,
});
// Async function to get public keys from key Id in jwks.json
function getKey(header, callback) {
client.getSigningKey(header.kid, (err, key) => {
var signingKey = key.publicKey || key.rsaPublicKey;
callback(null, signingKey);
});
}
// Verify jwt. getKey function will take the header from your idToken and get
the corresponding public key. This public key will be used by jwt.verify() to
actually verify the token.
jwt.verify(idToken, getKey, { audience: CLIENT_ID, issuer: ISSUER_URI }, function(err, decoded) {
console.log("RES", err, decoded);
// Additional verifications like token expiry can be done here.
}