AWS Cognito 验证客户端发送到我的应用程序的 ID 和访问令牌的方法是什么

AWS Cognito What is the way to verify the ID and access tokens sent by clients to my application

我在 Cognito 中创建了一个用户池,登录到我的应用程序后,我将 AWS Cognito 生成的三个令牌存储在会话中。

我需要将这些令牌传递给第三方 API,他们会在 return 中向我发送响应以及已发送的令牌。

如何仅使用用户池 ID 和客户端应用程序 ID 验证令牌。

这篇AWS Blog post详细解释了解决方法。

Amazon Cognito生成的ID Token和Access Token是JWT。 Cognito 使用两个 RSA 密钥对来生成这些令牌。每对的私钥用于签署令牌。 public 密钥可用于验证令牌。这些 public 键可在

https://cognito-idp.{REGION}.amazonaws.com/{YOUR_USER_POOL_ID}/.well-known/jwks.json

使用此路径中的密钥 ID,您需要获取 public 密钥。使用此 public 密钥,您可以验证令牌。

以下是实现上述逻辑的 NodeJS 代码片段。完整的例子可以在 this commit

看到
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.
}