En su artículo en Medium, Ryan Chenkie sugiere utilizar el siguiente código para interceptar las respuestas 401:

[sourcecode language="javascript"]
importa 'rxjs/add/operator/do';

export class JwtInterceptor implements HttpInterceptor {

constructor(public auth:AuthService) {}

intercept(request: HttpRequest, next: HttpHandler): Observable {

return next.handle(request).do((event: HttpEvent) => {
if (event instanceof HttpResponse) {
// haz cosas con la respuesta si quieres
}
}, (err: any) => {
if (err instanceof HttpErrorResponse) {
if (err.status === 401) {
// redirige a la ruta de inicio de sesión
// o muestra un modal
}
}
});
}
}
[/sourcecode]

Hay un problema con este enfoque, y es el uso del operador Rx do(). La cadena observable continuará después del gestor de errores en el segundo argumento de do(). La respuesta de error puede burbujear a un gestor de errores genérico o a un servicio o componente.

En nuestro caso, esto evitó una redirección a la página de inicio de sesión.

Sugiero la siguiente mejora, sustituyendo do() por catch():

[sourcecode language="javascript"]
importa 'rxjs/add/operator/catch';

@Injectable()
export class UnauthorisedInterceptor implements HttpInterceptor {
constructor(
private router: Router
) {}

intercept(request: HttpRequest, next: HttpHandler): Observable {
return next.handle(request).catch((err: any) => {
if (err instanceof HttpErrorResponse && err.status === 401) {
this.router.navigate(['/login'], {
queryParams: {
redirectTo: document.location.pathname
}
});

// esta respuesta se gestiona
// detiene la cadena de gestores devolviendo vacío
return Observable.empty();
}

// rethrow para que otros gestores de errores puedan recogerlo
return Observable.throw(err);
});
}
}
[/sourcecode]

Autor: 01 oct 2017