【问题标题】:Send cognito authentication as a promise is giving "Cannot read property 'promise' of undefined"发送认知身份验证作为承诺给出“无法读取未定义的属性'承诺'”
【发布时间】:2019-11-18 02:40:27
【问题描述】:

我正在开发一个用于登录 Cognito 的 lambda 函数,但在等待我的 cognito 身份验证时遇到问题。

我尝试像在示例中一样使用代码,将 onSuccessonFailure 函数作为参数传递,但该函数无需等待即可完成。 然后,我尝试做出承诺,就像我发送 SES 电子邮件一样,但它给出的消息是“无法读取未定义的属性 'promise'”

到目前为止我的代码:

'use strict';

global.fetch = require('node-fetch');
let AmazonCognitoIdentity = require('amazon-cognito-identity-js');

function criarResposta( statusCode, retorno ) {
    return {
        statusCode: statusCode,
        body: retorno
    };
}

module.exports.login = async (event) => {
    let enviar_promise = null;
    let nome_usuario = "::USER_NAME::";
    let senha_usuario = "::USER_PASSWORD::";

    let authentication_data = {
        Username : nome_usuario,
        Password : senha_usuario,
    };
    let authentication_details = new AmazonCognitoIdentity.AuthenticationDetails(authentication_data);
    let pool_data = { 
        UserPoolId : '::USER_POOL_ID::',
        ClientId : '::CLIENT_ID::'
    };
    let user_pool = new AmazonCognitoIdentity.CognitoUserPool(pool_data);
    let user_data = {
        Username : nome_usuario,
        Pool : user_pool
    };
    let cognito_user = new AmazonCognitoIdentity.CognitoUser(user_data);

    enviar_promise = cognito_user.authenticateUser( authentication_details ).promise();

    try {
        const dados = await enviar_promise;
        return criarResposta( 200, `{
            "message": "OK"
        }` );
    } catch (err) {
        console.error(err, err.stack);
        return criarResposta( 500, `{
            "message": "Erro interno"
        }` );
    }
};

编辑

我已经根据example 更新了我的代码,现在它看起来正在等待响应,它返回代码 200 和 {message: "OK"},但它在 console.log(resultado) 上打印 undefined ;

代码:

'use strict';

global.fetch = require('node-fetch');
let AmazonCognitoIdentity = require('amazon-cognito-identity-js');
let AWS = require('aws-sdk');

function criarResposta( statusCode, retorno ) {
    return {
        statusCode: statusCode,
        body: retorno
    };
}

module.exports.login = async (event) => {
    let enviar_promise = null;
    let nome_usuario = "::USER_NAME::";
    let senha_usuario = "::USER_PASSWORD::";

    let authentication_data = {
        Username : nome_usuario,
        Password : senha_usuario,
    };
    let authentication_details = new AmazonCognitoIdentity.AuthenticationDetails(authentication_data);
    let pool_data = { 
        UserPoolId : '::USER_POOL_ID::',
        ClientId : '::CLIENT_ID::'
    };
    let user_pool = new AmazonCognitoIdentity.CognitoUserPool(pool_data);
    let user_data = {
        Username : nome_usuario,
        Pool : user_pool
    };
    let cognito_user = new AmazonCognitoIdentity.CognitoUser(user_data);

    try {
        let resultado = await cognito_user.authenticateUser( authentication_details );

        // let access_token = resultado.getAccessToken().getJwtToken();
        // let id_token = resultado.idToken.jwtToken;

        console.log( resultado );

        return criarResposta( 200, `{
            "message": "OK"
        }` );
    } catch (err) {
        console.error(err, err.stack);
        return criarResposta( 500, `{
            "message": "Erro interno"
        }` );
    }
};

编辑 2

所以,我做了一个纯 nodejs 代码,它返回访问令牌和令牌 id:

global.fetch = require('node-fetch');
let AmazonCognitoIdentity = require('amazon-cognito-identity-js');
let AWS = require('aws-sdk');

AWS.config.update({
    accessKeyId: '::VALOR::',
    secretAccessKey: '::VALOR::',
    region: 'us-east-2'
});

let enviar_promise = null;
let nome_usuario = "::VALOR::";
let senha_usuario = "::VALOR::";

let authentication_data = {
    Username : nome_usuario,
    Password : senha_usuario,
};
let authentication_details = new AmazonCognitoIdentity.AuthenticationDetails(authentication_data);
let pool_data = { 
    UserPoolId : '::VALOR::',
    ClientId : '::VALOR::'
};
let user_pool = new AmazonCognitoIdentity.CognitoUserPool(pool_data);
let user_data = {
    Username : nome_usuario,
    Pool : user_pool
};
let cognito_user = new AmazonCognitoIdentity.CognitoUser(user_data);

cognito_user.authenticateUser(authentication_details, {
    onSuccess: function (result) {
        let accessToken = result.getAccessToken().getJwtToken();
        let idToken = result.idToken.jwtToken;

        console.log( accessToken );
        console.log( idToken );
    },
    onFailure: function(err) {
        console.log(err);
    },
});

我认为问题在于尝试将 authenticateUser 作为承诺发送,但我不知道如何让 lambda 在没有它的情况下等待我的请求

【问题讨论】:

  • 唯一合理的结论是cognito_user.authenticateUser( authentication_details )返回undefind
  • 您链接到的示例是一个提案,而不是实现的 API。
  • 在亚马逊示例中,它用于获取访问令牌,我想我可能传递了一些错误的数据,我要检查我的代码

标签: javascript promise aws-lambda amazon-cognito


【解决方案1】:

'use strict';

global.fetch = require('node-fetch');
let AmazonCognitoIdentity = require('amazon-cognito-identity-js');
let AWS = require('aws-sdk');

function criarResposta( statusCode, retorno ) {
    return {
        statusCode: statusCode,
        body: retorno
    };
}

module.exports.login = async (event) => {
    let enviar_promise = null;
    let nome_usuario = "::USER_NAME::";
    let senha_usuario = "::USER_PASSWORD::";

    let authentication_data = {
        Username : nome_usuario,
        Password : senha_usuario,
    };
    let authentication_details = new AmazonCognitoIdentity.AuthenticationDetails(authentication_data);
    let pool_data = { 
        UserPoolId : '::USER_POOL_ID::',
        ClientId : '::CLIENT_ID::'
    };
    let user_pool = new AmazonCognitoIdentity.CognitoUserPool(pool_data);
    let user_data = {
        Username : nome_usuario,
        Pool : user_pool
    };
    let cognito_user = new AmazonCognitoIdentity.CognitoUser(user_data);

    try {
        let resultado = await cognito_user.authenticateUser( authentication_details ).promise();

        // let access_token = resultado.getAccessToken().getJwtToken();
        // let id_token = resultado.idToken.jwtToken;

        console.log( resultado );

        return criarResposta( 200, `{
            "message": "OK"
        }` );
    } catch (err) {
        console.error(err, err.stack);
        return criarResposta( 500, `{
            "message": "Erro interno"
        }` );
    }
};

【讨论】:

  • 当我添加 .promise() 时,就像在代码的第一个版本中一样,它会返回“ERROR TypeError: Cannot read property 'promise' of undefined”
【解决方案2】:

经过更多搜索,我发现可以以不同的方式声明 lambda 函数并使用回调。对我来说效果很好。

代码:

'use strict';

global.fetch = require('node-fetch');
let AmazonCognitoIdentity = require('amazon-cognito-identity-js');

module.exports.autenticacao = (event, context, callback) => {
    const dados_requisicao = JSON.parse( event.body );

    let authentication_data = {
        Username : dados_requisicao.usuario,
        Password : dados_requisicao.senha,
    };
    let authentication_details = new AmazonCognitoIdentity.AuthenticationDetails(authentication_data);
    let pool_data = { 
        UserPoolId : '::VALOR::',
        ClientId : '::VALOR::'
    };
    let user_pool = new AmazonCognitoIdentity.CognitoUserPool(pool_data);
    let user_data = {
        Username : dados_requisicao.usuario,
        Pool : user_pool
    };
    let cognito_user = new AmazonCognitoIdentity.CognitoUser(user_data);

    cognito_user.authenticateUser(authentication_details, {
        onSuccess: function (result) {
            let access_token = result.getAccessToken().getJwtToken();
            let id_token = result.idToken.jwtToken;

            callback(undefined, {
                statusCode: 200,
                body: JSON.stringify({
                    message: "OK",
                    accessToken: access_token,
                    idToken: id_token
                }),
            });
        },
        onFailure: function(err) {
            callback({
                statusCode: 500,
                body: JSON.stringify({
                    message: "Erro interno"
                }),
            });
        },
    });
};

【讨论】:

  • 我不明白你为什么要使用回调,你能解释一下吗?
  • 对不起,我离开那家公司已经 2 年了,我不记得为什么会这样
猜你喜欢
  • 2019-03-10
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
  • 2017-01-23
  • 2017-07-19
  • 1970-01-01
  • 2019-05-16
  • 2018-05-28
相关资源
最近更新 更多