我在这里完全茫然。我一直在努力几个小时,现在尝试多种不同的方法,但是没有任何方法可以使我无所适从。我的问题是,我似乎无法弄清楚在对Cognito进行身份验证请求后,如何在newPasswordRequired回调中从用户检索新密码。这是我当前状态下的代码。请不要犹豫告诉我我可以做些什么,因为我对Angular相当陌生,而对使用Cognito身份验证则是全新的。
public login(email: string, password: string): Observable<UserModel> {
const cognitoUser = new CognitoUser(this.getUserData(email));
cognitoUser.setAuthenticationFlowType('USER_PASSWORD_AUTH');
const authenticationDetails = new AuthenticationDetails(CognitoUtils.getAuthDetails(email, password));
const self = this;
return Observable.create((obs: Observer<UserModel>) => {
cognitoUser.authenticateUser(authenticationDetails, {
onSuccess: result => {
this.session = result;
const token = result.getIdToken();
const accessToken = result.getAccessToken();
this.localStorage.setToken(token);
this.localStorage.setAccessToken(accessToken);
obs.complete();
},
onFailure: err => {
obs.error(err);
},
newPasswordRequired: (userAttributes, requiredAttributes) => {
let dialogRef: MatDialogRef<NewPasswordComponent>;
const config = new MatDialogConfig();;
config.role = 'dialog';
config.width = '40%';
config.data = { newPass: self.newPass };
dialogRef = self.dialog.open(NewPasswordComponent, config);
dialogRef.afterClosed().subscribe(result => {
self.newPass = result;
cognitoUser.completeNewPasswordChallenge(self.newPass, userAttributes, {
onSuccess: result => {
obs.complete();
},
onFailure: err => {
obs.error(err);
}
});
});
}
});
});
}
答案 0 :(得分:1)
根据您提供的内容,问题似乎出在当您使用completeNewPasswordChallenge
进行响应时,您正在传递从newPasswordRequired回调返回的userAttributes,将无法使用。
相反,您需要查看需要哪些属性(即requiredAttributes)并将它们作为对象传递。例如,如果“名称” 是必需属性,则可以通过以下方式传递:
dialogRef.afterClosed().subscribe(result => {
self.newPass = result;
cognitoUser.completeNewPasswordChallenge(self.newPass, {"name":"John Doe"}, {
onSuccess: result => {
obs.complete();
},
onFailure: err => {
obs.error(err);
}
});
希望这会有所帮助!