Javascript Cognito getId:NotAuthorizedException:登录令牌无效。不是有效的OpenId连接标识令牌

Javascript Cognito getId:NotAuthorizedException:登录令牌无效。不是有效的OpenId连接标识令牌,javascript,amazon-web-services,amazon-cognito,Javascript,Amazon Web Services,Amazon Cognito,我是Cognito的新手(JWT代币和整个auth的东西),所以请原谅我问了一些愚蠢的问题。我正在尝试将Cognito用户池与标识池一起使用。我使用默认URL(&scope=openid&redirect_uri=)登录了一个用户,并获得了一个令牌。我无法确定如何从这个令牌中获取标识id,以便在getId()API中使用。我想稍后使用它从联邦身份池获取凭据(不确定我是否拥有正确的部分) 作为参考,我有我的代码- var AWS = require('aws-sdk'); var cognitoi

我是Cognito的新手(JWT代币和整个auth的东西),所以请原谅我问了一些愚蠢的问题。我正在尝试将Cognito用户池与标识池一起使用。我使用默认URL(&scope=openid&redirect_uri=)登录了一个用户,并获得了一个令牌。我无法确定如何从这个令牌中获取标识id,以便在getId()API中使用。我想稍后使用它从联邦身份池获取凭据(不确定我是否拥有正确的部分)

作为参考,我有我的代码-

var AWS = require('aws-sdk');
var cognitoidentity = new AWS.CognitoIdentity({apiVersion: '2014-06-30'});

exports.handler = (event, context, callback) => {
// TODO implement
var params = {
    IdentityPoolId: 'us-east-2:<xxxxxx>', /* required */
    AccountId: 'xxxxxxx',
    Logins: {
        'cognito-idp.us-east-2.amazonaws.com/us-east-2_xxxxx': '<**identityID???**>',
        }
    };

cognitoidentity.getId(params, function(err, data) {
    if (err) console.log('Error3 : ' + err, err.stack); // an error occurred
    else {
        console.log('retval:' + JSON.stringify(data));           // successful response
        var idenId = data.idenId;

        var params = {
            IdentityId: idenId,
            CustomRoleArn: 'arn:aws:iam::xxxxxxxxx:role/cc_admin',
            Logins: {
                'CognitoIdentity': 'cognito-idp.us-east-2.amazonaws.com/us-east-2_xxxxxxx'
            }
        };

        cognitoidentity.getCredentialsForIdentity(params, function(err, data) {
            if (err) console.log(err, err.stack); // an error occurred
            else     console.log(data);           // successful response
        });

    }
});
callback(null, 'Hello from Lambda 1');
};
var AWS=require('AWS-sdk');
var cognitoidentity=新的AWS.cognitoidentity({apiVersion:'2014-06-30'});
exports.handler=(事件、上下文、回调)=>{
//待办事项实施
变量参数={
IdentityPoolId:'us-east-2:',/*必需*/
帐户ID:'xxxxxxx',
登录:{
“cognito idp.us-east-2.amazonaws.com/us-east-2_uuxxxxx”:”,
}
};
getId(参数,函数(错误,数据){
if(err)console.log('Error3:'+err,err.stack);//发生错误
否则{
console.log('retval:'+JSON.stringify(data));//响应成功
var idenId=data.idenId;
变量参数={
识别号:idenId,
CustomRoleArn:'arn:aws:iam::xxxxxxxxx:role/cc_admin',
登录:{
“CognitoIdentity”:“cognito idp.us-east-2.amazonaws.com/us-east-2_xxxxxxx”
}
};
getCredentialsForIdentity(参数,函数(错误,数据){
if(err)console.log(err,err.stack);//发生错误
else console.log(数据);//响应成功
});
}
});
回调(null,“来自Lambda 1的你好”);
};
错误-“2018-06-06T18:59:58.614Z ce0fc216-69bb-11e8-bbfc-4fff0d953dd4错误3:NotAuthorizedException:无效的登录令牌。令牌签名无效。NotAuthorizedException:无效的登录令牌。令牌签名无效。”

我已尝试解析接收到的JWT令牌(使用JWT.io)。它向我显示了一些细节,但它们似乎都不是要在请求中使用的标识id。我还尝试将整个令牌用作标识id


我真的需要帮助。谢谢。

首先,您只需在参数中传递标识池Id,getId函数就可以工作。它将返回与您的标识池关联的IdentityId。替换

var params = {
    IdentityPoolId: 'us-east-2:<xxxxxx>', /* required */
    AccountId: 'xxxxxxx',
    Logins: {
    'cognito-idp.us-east-2.amazonaws.com/us-east-2_xxxxx': '<**identityID???**>',
    }
};
您只能通过登录…在配置aws cli后在终端上运行此命令或使用aws sdk并运行功能来获取此令牌

最后,将传递给getCRedentials方法“Logins”键的params函数更改为:

Logins: {
      "IdentityId": <result from getId>
      "cognito-idp.us-east-2.amazonaws.com/us-east-2_xxxxxxx": <your idToken>
}
登录:{
“标识ID”:
“cognito idp.us-east-2.amazonaws.com/us-east-2_uxxxxxxx”:
}
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
aws cognito-idp admin-initiate-auth --user-pool-id ap-south-1_xxxxxxx --client-id AAAAAAAAAAAAAAAAAAAAA --auth-flow ADMIN_NO_SRP_AUTH --auth-parameters USERNAME="abc@123.com",PASSWORD="********" 
Logins: {
      "IdentityId": <result from getId>
      "cognito-idp.us-east-2.amazonaws.com/us-east-2_xxxxxxx": <your idToken>
}