我是 Cognito 的新手,并且陷入了一段时间。
我正在尝试使用 Cognito 登录用户。响应第一次返回 NEW_PASSWORD_REQUIRED 质询。
import Auth from '@aws-amplify/auth';
...
Auth.signIn(this.username, this.password)
.then((user: any) => {
if (user) {
if (user.challengeName && user.challengeName == 'NEW_PASSWORD_REQUIRED') {
this.sessionService.setUser(user);
this.router.navigate([this.confirmAccountUrl]);
} else {
this.router.navigate([this.dashboardUrl]);
}
}
})
.catch((error: any) => {
switch (error.code) {
case 'UserNotConfirmedException':
this.router.navigate([this.confirmAccountUrl]);
break;
case 'NotAuthorizedException':
this.message = 'Your temporary password is expired and must be reset by admin';
break;
case 'UsernameExistsException':
this.message = 'Invalid username or password';
break;
}
});
我希望用户转到下一个组件并在那里提供密码。
问题是返回的结果是CognitoUser类型。这需要传递给reset-password组件。
我尝试将结果保存到会话并在重置密码组件中检索。
constructor(
private sessionService: SessionService
) {
this.user = this.sessionService.getUser();
}
resetPassword() {
Auth.completeNewPassword(this.user, this.new_password)
.then((data) => {
console.log(data);
})
.catch((err) => console.error('Error', err));
}
这给了我错误:
Error TypeError: user.completeNewPasswordChallenge is not a function
我在 google 上做了一些研究,发现user实际上是一个 json 对象,但不是CognitoUser类型
没有可以将用户解析为CognitoUser的函数,Amplify 中也没有存储它的函数。
这是会话服务:
import { Injectable } from '@angular/core';
import { SessionStorageService } from 'angular-web-storage';
@Injectable({
providedIn: 'root'
})
export class SessionService {
constructor(
private sessionStorageService: SessionStorageService
) { }
setUser(user: any) {
this.sessionStorageService.set('user', user);
}
getUser(): any {
return this.sessionStorageService.get('user');
}
}
Auth.authenticatedUser不会返回值,因为用户尚未通过身份验证。
我在这里做错了什么?