我在 Node.js 中有一个后端 API,可从查询参数中检索 Amazon Cognito ID token 。我需要检查此 token 是否有效。有什么方法可以使用 aws-sdk
或 amazon-cognito-identity-js
SDK 来检查吗?
最佳答案
我为此苦苦挣扎了几天,我刚刚找到了如何做到这一点,这是一个可以为您进行验证的完整功能,您需要提供的只是与您之前创建的认知池相关的 userPoolId 和 pool_region然后您可以通过将 token 作为参数发送到任何您想要的地方调用此函数,如果 token 是否有效,您将在控制台上获得结果,这是实现它的方法:
- 创建一个名为 tokenValidation.js 的文件(例如)
- 将此代码粘贴到其中:
// Cognito data
const userPoolId = "###########"; // Cognito user pool id here
const pool_region = '#########'; // Region where your cognito user pool is created
const jwt = require('jsonwebtoken');
const jwkToPem = require('jwk-to-pem');
const request = require('request');
// Token verification function
const ValidateToken = (token) => {
console.log('Validating the token...')
request({
url: `https://cognito-idp.${pool_region}.amazonaws.com/${userPoolId}/.well-known/jwks.json`,
json: true
}, (error, response, body) => {
console.log('validation token..')
if (!error && response.statusCode === 200) {
pems = {};
var keys = body['keys'];
for(var i = 0; i < keys.length; i++) {
//Convert each key to PEM
var key_id = keys[i].kid;
var modulus = keys[i].n;
var exponent = keys[i].e;
var key_type = keys[i].kty;
var jwk = { kty: key_type, n: modulus, e: exponent};
var pem = jwkToPem(jwk);
pems[key_id] = pem;
}
//validate the token
var decodedJwt = jwt.decode(token, {complete: true});
if (!decodedJwt) {
console.log("Not a valid JWT token");
return;
}
var kid = decodedJwt.header.kid;
var pem = pems[kid];
if (!pem) {
console.log('Invalid token');
return;
}
jwt.verify(token, pem, function(err, payload) {
if(err) {
console.log("Invalid Token.");
} else {
console.log("Valid Token.");
console.log(payload);
}
});
} else {
console.log(error)
console.log("Error! Unable to download JWKs");
}
});
}
// Exporting it to call it anywere you want
exports.ValidateToken = ValidateToken
在您需要时像这样导入它:
const validateToken = require('./tokenValidation')
最后这样调用它:
validateToken.ValidateToken(result.getAccessToken().getJwtToken())
我知道这是一个老问题,但我真的希望这对以后的其他人有所帮助。
关于node.js - Cognito - 检查 idToken 的有效性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54495039/