Создание глобального заголовка авторизации в HttpClient Interceptor

Я делаю глобальный заголовок авторизации в моем приложении. Я использовал перехватчик, поэтому я не буду объявлять заголовок авторизации в моих функциях get(). Правильно ли я реализую перехватчик, поскольку, когда я вызываю функции get(), он все еще запрашивает токен. Там написано, что токен не предоставляется. Есть ли проблема в моем auth.interceptor? Должен ли я объявить маркер носителя заголовка авторизации в каждой функции get()? Я думал, что перехватчик вызывается каждый раз, когда есть запрос отправлен / получен?

auth.interceptor.ts

@Injectable()
export class AuthInterceptor implements HttpInterceptor {
    private authService: AuthService;

    constructor(private injector: Injector) {}

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        // Get the auth header from the service.
        this.authService = this.injector.get(AuthService);
        const token = this.authService.getToken();
            if (token) {
                req = req.clone({ headers: req.headers.set('Authorization', 'Bearer ' + token) });
            }

            if (!req.headers.has('Content-Type')) {
                req = req.clone({ headers: req.headers.set('Content-Type', 'application/json') });
            }

            req = req.clone({ headers: req.headers.set('Accept', 'application/json') });
            return next.handle(req);
        }
}

products.component.ts

getAll() {
    return this.httpClient.get<any>(this.url).map(response => response.json());
    }

1 ответ

Решение

Вы делаете правильный путь!

Перехватчики предназначены для перехвата всех вызовов http, и вы можете изменить запрос, который является глобальным.

Я думаю, что проблема в этих условиях. Вы можете отлаживать их и решать их.

            if (token) {
                req = req.clone({ headers: req.headers.set('Authorization', 'Bearer ' + token) });
            }

            if (!req.headers.has('Content-Type')) {
                req = req.clone({ headers: req.headers.set('Content-Type', 'application/json') });
            }

Может быть, некоторые из них возвращают ноль!

Но если время получения токена является проблемой, вы можете сделать асинхронный вызов, чтобы получить токен.

this.authService.LoginUser().subscribe(( token) => { 
   if (token) { 
     req = req.clone({ headers: req.headers.set('Authorization', 'Bearer ' + token) }); 
   } 

   if (!req.headers.has('Content-Type')) { 
     req = req.clone({ headers: req.headers.set('Content-Type', 'application/json') }); 
   } 

   req = req.clone({ headers: req.headers.set('Accept', 'application/json') }); 
   return next.handle(req); 
} 
});
Другие вопросы по тегам