gpt4 book ai didi

reactjs - 如何等待 aws cognito authenticateUser 调用(这似乎是一个回调)

转载 作者:行者123 更新时间:2023-12-03 19:48:03 26 4
gpt4 key购买 nike

所以我们使用了 await/async 调用,但是 aws-amplify 提供的 authenticateUser 命令似乎使用了回调。我是一名 python 编码员,已经有一段时间没有使用 node 进行编码了,所以这可能是一个天真的问题!

我尝试将其转换为这样的 promise :

function authenticateUserAsync(user, authDetails) {
return new Promise(function(resolve, reject, challenge) {
user.authenticateUser(authDetails, {
onSuccess: resolve,
onFailure: reject,
newPasswordRequired: challenge });

}).then(
function(result) {
return result;
});
}

然后
 idToken = await authenticateUserAsync(user, authDetails,
function(result) {
console.log("Token: ");
console.log(result.idToken);
return result.idToken;
},
function(err) {
console.log(err);
this.setState({idToken: ''});
if (err.code == 'NotAuthorizedException') {
return 'not_authorized';
} else {
return 'unknown_error';
}

},
function(userAttrs, reqAttrs) {
return 'challenge';
}
);

但是,无论我如何调整它,代码都会继续运行,然后我得到一个未处理的 promise 拒绝(在我的测试中,此时身份验证失败)

最佳答案

很高兴您尝试调用 authenticateUser()使用现代 Javascript 构造,但是您的方法存在几个问题。我真的很想看到完成的代码。

主要问题是 Cognito authenticateUser()需要三个回调,而 Promise 只处理两个。可以为 newPasswordRequired 传递一个虚拟函数回调,如果您从没想过会遇到该代码路径。另一种方法是使用 resolve onSuccess 的功能和 newPasswordRequired回调。

第二个问题是您的 authenticateUserAsync()只需要两个参数。您正在尝试向它传递一些额外的回调。这些回调被忽略。这就是为什么它直接流过并且你得到一个未处理的 promise 异常。不必要的 .then()也没有帮助。

我的实现最终是这样的:

function asyncAuthenticateUser(cognitoUser, cognitoAuthenticationDetails) {
return new Promise(function(resolve, reject) {
cognitoUser.authenticateUser(cognitoAuthenticationDetails, {
onSuccess: resolve,
onFailure: reject,
newPasswordRequired: resolve
})
})
}

async signIn({ commit }, authData) {
let cognitoUserPool = new CognitoUserPool(config.poolDetails)
let cognitoAuthenticationDetails = new AuthenticationDetails(authData);
let userData = { Username: authData.Username, Pool: cognitoUserPool }
let cognitoUser = new CognitoUser(userData)

try {
let result =
await asyncAuthenticateUser(cognitoUser, cognitoAuthenticationDetails)

if ('idToken' in result) {
console.log('We have a token: ' + JSON.stringify(p));
}
else {
console.log('We need a new password.')
delete result.email_verified // Not accepted by the challenge call
delete result.phone_number_verified // Also not accepted

// Get a new password from the user then call
// cognitoUser.completeNewPasswordChallenge()
}
catch (error) {
// Probably a mis-typed password
console.log(error.message)
}
}

amazon-cognito-identity-js 的替代库,它使用常见的 ES6 概念,例如 async/await 会受到欢迎。

关于reactjs - 如何等待 aws cognito authenticateUser 调用(这似乎是一个回调),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50109267/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com