Cognito - idToken的检查有效性

时间:2019-02-02 16:29:26

标签: node.js amazon-cognito

我在Node.js中有一个后端API,该API从查询参数中检索Amazon Cognito ID令牌。我需要检查此令牌是否有效。有没有办法使用aws-sdkamazon-cognito-identity-js SDK进行检查?

5 个答案:

答案 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然后,您可以通过发送令牌作为参数在任何地方调用此函数,无论令牌是否有效,您都会在控制台上获得结果,这是实现它的方法:

  1. 创建一个名为tokenValidation.js的文件(例如)
  2. 将此代码粘贴到其中:

// 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

  1. 在需要时导入,例如:const validateToken = require('./tokenValidation')

  2. 并最终这样称呼它: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 });
});