50 lines
1.2 KiB
TypeScript
50 lines
1.2 KiB
TypeScript
|
// vim: set tw=80 ts=2 sw=2 sts=2 :
|
||
|
|
||
|
import { Injectable } from '@angular/core';
|
||
|
import {
|
||
|
HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpErrorResponse
|
||
|
} from '@angular/common/http';
|
||
|
|
||
|
import { Observable} from 'rxjs/Rx';
|
||
|
import 'rxjs/add/operator/map';
|
||
|
|
||
|
import { Logger } from '@nsalaun/ng-logger';
|
||
|
|
||
|
import { LoginService } from './login.service';
|
||
|
|
||
|
@Injectable()
|
||
|
export class AuthInterceptor implements HttpInterceptor {
|
||
|
constructor(
|
||
|
private logger: Logger,
|
||
|
private loginService: LoginService,
|
||
|
) {}
|
||
|
|
||
|
intercept(
|
||
|
req: HttpRequest<any>,
|
||
|
next: HttpHandler
|
||
|
): Observable<HttpEvent<any>> {
|
||
|
this.logger.log('Intercepted request', req, next);
|
||
|
|
||
|
if(!req.headers.has('Authorization')) {
|
||
|
let accessToken: string = this.loginService.accessToken();
|
||
|
|
||
|
if(accessToken){
|
||
|
req = req.clone({
|
||
|
headers: req.headers.set('Authorization', `Bearer ${accessToken}`)
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
this.logger.log('Request', req);
|
||
|
|
||
|
return next.handle(req).map(
|
||
|
(event: HttpEvent<any>) => event,
|
||
|
(error) => {
|
||
|
if(error instanceof HttpErrorResponse && error.status === 401) {
|
||
|
this.logger.error('Unauthorized', error);
|
||
|
}
|
||
|
}
|
||
|
);
|
||
|
}
|
||
|
}
|