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