我在Node.js中有一个后端API,该API从查询参数中检索Amazon Cognito ID令牌。我需要检查此令牌是否有效。有没有办法使用aws-sdk
或amazon-cognito-identity-js
SDK进行检查?
答案 0 :(得分:1)
我使用AWS lib https://github.com/awslabs/aws-support-tools/tree/master/Cognito/decode-verify-jwt在带有节点的lambda中进行了检查。
默认情况下,它会检查AccessToken,但您可以对其进行修改以验证IdToken。
替换:
if (claim.token_use !== 'access') {
throw new Error('claim use is not access');
}
作者
if (claim.token_use !== "id") {
throw new Error("claim use is not id");
}
和
console.log(`claim confirmed for ${claim.username}`);
result = {userName: claim.username, clientId: claim.client_id, isValid: true};
作者
console.log(`claim confirmed for ${claim["cognito:username"]}`);
result = {userName: claim["cognito:username"], clientId: claim.aud, isValid: true};
您甚至可以在结果中添加更多自定义属性。
答案 1 :(得分:0)
Cognito的ID令牌包含“EXP”,如权利要求解码时,这表明在此之后的ID令牌不会是有效的时间。 引用OpenID的官方documentation,
不得在其之后接受ID令牌的到期时间 进行处理。此参数的处理要求 当前日期/时间必须早于列出的到期日期/时间 值。
要在JavaScript中解码JWT令牌,可以引用由Auth0提供的JsonWebToken之类的库。
要使用该库使用上述库对现有的ID令牌进行解码,可以参考以下代码段:
// get the decoded payload ignoring signature, no secretOrPrivateKey needed
var decoded = jwt.decode(token);
// get the decoded payload and header
var decoded = jwt.decode(token, {complete: true});
console.log(decoded.header);
console.log(decoded.payload)
请注意,由Cognito生成的JWT令牌符合OIDC,并且您也可以参考此documentation以获得有关Cognito令牌的更多信息。
答案 2 :(得分:0)
Amazon拥有一个用于解码和验证Cognito令牌的库:https://github.com/awslabs/aws-support-tools/tree/master/Cognito/decode-verify-jwt
答案 3 :(得分:0)
我为此苦苦挣扎了几天,我只是找到了解决方法,这是一个功能全面的功能,可以为您提供的验证功能是与先前创建的认知池相关的userPoolId和pool_region然后,您可以通过发送令牌作为参数在任何地方调用此函数,无论令牌是否有效,您都会在控制台上获得结果,这是实现它的方法:
// 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())
我知道这是一个老问题,但我真的希望这会在将来对其他人有所帮助。
答案 4 :(得分:0)
只需您可以使用aws-sdk CognitoIdentityServiceProvider
进行检查var params = { AccessToken: 'STRING_VALUE' /* required */ };
cognitoidentityserviceprovider.getUser(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response });
});