【发布时间】:2019-11-21 07:55:19
【问题描述】:
我有一个带有登录方法和登录组件的身份验证服务。
从我的登录组件的 onSubmit 方法中,我调用服务的登录方法并订阅答案。
具有挑战性的部分是,在该登录方法中,我必须执行多个后续请求(一次调用以获取生成的用户名令牌,然后使用该令牌加密输入的密码并再次调用以真正登录在服务器上)。不知道如何做到这一点,尝试了很多方法,但在 Observable 方面我还是很陌生。
登录组件:
this.authenticationService.login(this.f.username.value, this.f.password.value)
.pipe(first())
.subscribe(
data => {
this.router.navigate([this.returnUrl]);
},
error => {
this.alertService.error(error);
this.loading = false;
});
认证服务:
login(username, password) {
return this.http.post<any>(`${config.apiUrl}/users/authenticate`, { username, password })
.pipe(map(user => {
// store user details and jwt token in local storage to keep user logged in between page refreshes
localStorage.setItem('currentUser', JSON.stringify(user));
this.currentUserSubject.next(user);
return user;
}));
}
我使用 http.get().pipe 和许多变体尝试了多个嵌套调用,但显然我仍然缺少一些基本的理解。
sn-p/idea 来自这里:https://jasonwatmore.com/post/2019/06/10/angular-8-user-registration-and-login-example-tutorial
编辑:
我有一个解决方案,但它很难看,有可能改进吗?
return new Observable((observer) => {
this.http.get<any>(urlToken)
.pipe(map(answer => {
if (answer['type'] != 'Success') { return; }
let token = answer['message'];
urlLogin += '&passphrase=' + someSalt(username, password, token);
return this.http.get<any>(urlLogin)
.pipe(map(answer2 => {
if (answer2['type'] != 'Success') { return; }
let sessionId = answer2['message'];
let user = new User();
user.username = username;
user.sessionId = sessionId;
localStorage.setItem('currentUser', JSON.stringify(user));
this.currentUserSubject.next(user);
observer.next(user);
})).subscribe();
})).subscribe();
});
【问题讨论】:
标签: angular angular2-observables angular2-http angular8