【发布时间】:2019-11-18 02:40:27
【问题描述】:
我正在开发一个用于登录 Cognito 的 lambda 函数,但在等待我的 cognito 身份验证时遇到问题。
我尝试像在示例中一样使用代码,将 onSuccess 和 onFailure 函数作为参数传递,但该函数无需等待即可完成。 然后,我尝试做出承诺,就像我发送 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