Я создаю простую страницу входа с аутентификацией, используя Angular и Express.У меня есть следующее:
- компонент входа
- служба, которая выполняет http-вызовы и устанавливает локальное хранилище с полученным токеном jwt
- защитой маршрута для регистрациистраница
Моя охрана работает в том, что она запрещает доступ к маршруту '/ registration', если токена нет.Поскольку в самом первом входе в систему отсутствует токен, и, кажется, охранник проверяет его перед установкой токена при вызове onSubmit () компонента входа в систему, мне приходится дважды вызывать onSubmit () - один раз, чтобы получить ключ, а затем другой, чтобыавторизоваться.Я хотел бы иметь возможность войти сразу после ввода правильных учетных данных.
Как мне решить эту проблему?Заранее спасибо!
login-component.ts
...
this.loginForm = this.fb.group({
username: ['', Validators.required],
password: ['', Validators.required]
})
...
onSubmit() {
const formValue = this.loginForm.value;
if (formValue.username && formValue.password) {
this.authService.login(formValue.username, formValue.password)
.subscribe(
resp => { console.log(resp); },
err => { console.log(err); }
)
this.router.navigateByUrl('/registration');
}
}
auth-service.service.ts:
export class AuthSerivce {
constructor(private http: HttpClient) {}
login(username: string, password: string) {
const body = {
username: username,
password: password
}
return this.http.post<AuthResp>(ROUTES.login, body)
.pipe(
tap(res => this.setSession(res)),
catchError(this.handleError),
shareReplay()
)
}
...
private setSession(authResp: AuthResp) {
const expiresAt = moment().add(authResp.expiresIn, 'second');
localStorage.setItem('id_token', authResp.token);
localStorage.setItem("expires_at", JSON.stringify(expiresAt.valueOf()));
}
public isLoggedIn() {
return moment().isBefore(this.getExpiration());
}
public getExpiration() {
const expiration = localStorage.getItem("expires_at");
const expiresAt = JSON.parse(expiration);
return moment(expiresAt);
}
}
auth.guard.ts
export class AuthGuard implements CanActivate {
constructor(
private _authService: AuthService,
private _router: Router) { }
canActivate(): boolean {
if (this._authService.isLoggedIn()) {
return true;
} else {
this._router.navigate(['login']);
return false;
}
}
}