Z_z*_*z_Z 5 javascript authentication error-handling amazon-web-services amazon-cognito
我正在使用 AWS Cognito 对我正在构建的新应用程序中的用户进行身份验证。
我amazon-cognito-identity-js在我的项目中使用该库(链接到 Github:https : //github.com/aws-amplify/amplify-js/tree/master/packages/amazon-cognito-identity-js)。由于此特定用户池中的用户无法自行注册 - 我手动注册 - 我知道我需要 Github 的 README.md 中所述的“用例 23”。
所以我的代码如下:
...
const userPoolData = {
UserPoolId: <MY_USER_POOL_ID>,
ClientId: <MY_CLIENT_ID>
};
const userPool = new CognitoUserPool(userPoolData);
const authenticationData = {
Username: email,
Password: tempPassword
};
const userData = {
Username: email,
Pool: userPool
}
const authenticationDetails = new AuthenticationDetails(authenticationData);
const cognitoUser = new CognitoUser(userData);
cognitoUser.authenticateUser(authenticationDetails, {
onSuccess: (result) => {
console.log(result);
},
onFailure: (err) => {
console.log("Error from cognito auth: ", err);
},
newPasswordRequired: (userAttributes) => {
delete userAttributes.email_verified;
cognitoUser.completeNewPasswordChallenge(newPassword, userAttributes, this);
}
})
...
Run Code Online (Sandbox Code Playgroud)
当我执行此代码时,我成功确认了我的用户。我可以在 AWS Cognito 控制台中看到这一点。但是,我没有收到result对象,而是在客户端的 javascript 控制台中收到一条错误消息:
Uncaught (in promise) TypeError: Cannot read property 'onFailure' of undefined
at eval (CognitoUser.js:572)
at eval (Client.js:108)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用之前发送的newPassword代替登录时tempPassword,我现在能够成功获取result包含所有三个令牌的对象。
所以我知道一切都在工作,但不是我所期望的。
是什么导致了这个错误?我该如何解决?我想result在用户第一次使用tempPassword和他们登录时立即收到该对象,newPassword以便他们可以开始使用该应用程序。
认为我必须自己找回userAttributes是一个错误。该newPasswordRequired函数会自动传递它们。因此,我更新了上面的代码以使用 Github 上的“用例 23”。
但现在我得到一个与以前略有不同的错误:
Uncaught (in promise) TypeError: callback.onFailure is not a function
at eval (CognitoUser.js:572)
at eval (Client.js:108)
Run Code Online (Sandbox Code Playgroud)
就 Cognito 而言,一切仍然有效,但我的onFailure功能肯定有问题,这很奇怪。
有什么想法吗?
提前致谢
Z_z*_*z_Z 11
好的,我解决了。问题是我使用的是 ES6 箭头函数。作为Apolozeus指出的那样,我需要传递this到cognitoUser.completeNewPasswordChallenge函数。但是由于 ES6 的行为方式,this返回未定义。因此,将我的cognitoUser.authenticateUser功能更改为以下解决了所有问题:
cognitoUser.authenticateUser(authenticationDetails, {
onSuccess: function (result) {
resolve(result.getAccessToken().getJwtToken());
},
onFailure: function (err) {
console.log("Error from cognito promise: ", err);
reject(err);
},
newPasswordRequired: function (userAttributes) {
delete userAttributes.email_verified;
cognitoUser.completeNewPasswordChallenge(newPassword, userAttributes, this);
}
})
Run Code Online (Sandbox Code Playgroud)
我打算amazon-cognito-identity-js稍微玩一下这个库,看看我是否可以让 ES6 箭头函数在这里工作。不得不解决这个问题真的很烦人。
向 Apolozeus 寻求帮助
请将行更新cognitoUser.completeNewPasswordChallenge(newPassword, userAttributes);为cognitoUser.completeNewPasswordChallenge(newPassword, userAttributes, this)基本上,this将确保该callback函数位于同一对象内。
| 归档时间: |
|
| 查看次数: |
5074 次 |
| 最近记录: |