У меня есть служба аутентификации с методом входа и компонентом входа.
Из метода 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 и множество его вариантов, но, очевидно, мне все еще не хватает базового понимания.
Фрагмент/идея взята отсюда: 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();
});