В контексте сервера, автоматически обновляющего токен, я борюсь с основами: получение данных заголовка из ответа.
Похоже, что это не связано с CORS, поскольку мой Node/express использует токен авторизации/x-access-token и соответственно отвечает (см. скрин вкладки сети ниже).
Первый шаг, который я хочу видеть работающим, — это просто чтение заголовка из ответа. Посмотрите мой код, он шаблонный, как в документации. Событие, получающее Content-Length, возвращает null.
auth-service.ts
login(username:string, password:string):Observable<boolean>{
this.loggedIn = false;
return new Observable( (observer:Observer<boolean>) => {
const body = {user: username, pwd: password};
const url = this.config.API_ENDPOINT_PUBLIC_AUTH;
this.httpClient.post(url, body, {
responseType: 'text',
observe: "response"
}).first().subscribe(
(response:HttpResponse<string>) => {
// DEBUG
console.log(response.headers.get('Authorization'));
console.log(response.headers.get('X-Test-Header'));
console.log(response.headers.get('Content-length'));
this.token = response.headers.get('Authorization');
this.storeToken(this.token);
this.currentUser = username;
this.loggedIn = true;
this.authChanged$.next('auth');
observer.next(true);
},
(err) => observer.next(false),
() => {},
);
});
}
Вывод консоли:
нулевой
нулевой
нулевой
Сравните это с содержимым моей сетевой вкладки для этого запроса:
Излишне говорить, что мой HttpInterceptor тоже не работает - после предоставления заголовка авторизации в ответе он использует значение как новый токен. Это для реализации автоматического обновления токенов:
token.interceptor.ts
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const authService = this.injector.get(AuthService);
const token = authService.getToken();
if(token){
request = request.clone({
setHeaders: { 'x-access-token' : token }
});
}
return next.handle(request).do(
(event: HttpEvent<any>) => {
if (event instanceof HttpResponse) {
const response:HttpResponse<any> = (<HttpResponse<any>> event);
const authorizationHeader = response.headers.get('Authorization');
console.log('Authorization header value: ' + authorizationHeader);
if(authorizationHeader){
authService.setToken(authorizationHeader);
}
}
},
(err: any) => {
if (err instanceof HttpErrorResponse){
if (err.status === 401) {
this.router.navigate(['/']);
}
}
});
}