7

I want to check all my http responses from one place. For example authentication status. If response says user not authenticated any more I wanna redirect or something else. Is there any way to do that.

1
  • 1
    You should have a look to this document github.com/angular/http/issues/80. Angular2 Http interceptors and transformers are heavily discussed right now. If you need to redirect an unauthenticated user I would recommend you to do that server side (except for SPA) Commented Feb 9, 2016 at 13:00

2 Answers 2

6

Here we go

Create a Service like that

export const JWT_RESPONSE_HEADER = 'X-Auth-Token';

@Injectable()
export class AuthHttp extends Http {
  constructor(backend: ConnectionBackend, defaultOptions: RequestOptions) {
    super(backend, defaultOptions);
  }

  request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
    const request = super.request(url, this.appendAuthHeader(options));
    request.map(this.saveToken);
    return request;
  }

  get(url: string, options?: RequestOptionsArgs): Observable<Response> {
    const request = super.get(url, this.appendAuthHeader(options));
    request.map(this.saveToken);
    return request;
  }

  post(url: string, body: any, options?: RequestOptionsArgs): Observable<Response> {
    const request = super.post(url, body, this.appendAuthHeader(options));
    request.map(this.saveToken);
    return request;
  }

  put(url: string, body: any, options?: RequestOptionsArgs): Observable<Response> {
    const request = super.put(url, body, this.appendAuthHeader(options));
    request.subscribe(this.saveToken);
    return request;
  }

  delete(url: string, options?: RequestOptionsArgs): Observable<Response> {
    const request = super.delete(url, this.appendAuthHeader(options));
    request.map(this.saveToken);
    return request;
  }

  private appendAuthHeader(options?: RequestOptionsArgs): RequestOptionsArgs {
    let mergedOptions: RequestOptionsArgs;
    if (!options) {
      mergedOptions = { headers: new Headers() };
    } else {
      mergedOptions = options;
    }
    const token = localStorage.getItem(JWT_RESPONSE_HEADER);
    const isTokenSet = mergedOptions.headers.has('Authorization');
    if (token && !isTokenSet) mergedOptions.headers.append('Authorization', `Bearer ${token}`);
    return mergedOptions;
  }

  private saveToken(res: Response): void {
    const token = res.headers.get(JWT_RESPONSE_HEADER);
    if (token) localStorage.setItem(JWT_RESPONSE_HEADER, token);
  }
}

And include it in you app.module.ts like this

@NgModule({
    imports: [
        BrowserModule,
        ContentModule,
        routing,
        HttpModule
    ],
    declarations: [
        AppComponent,
        LoginComponent
    ],
    providers: [
        appRoutingProviders,
        LoginService,
        {
            provide: Http,
            useFactory: (backend: XHRBackend, defaultOptions: RequestOptions) => new AuthHttp(backend, defaultOptions),
            deps: [XHRBackend, RequestOptions]
        }
    ],
    bootstrap: [AppComponent]
})
export class AppModule {
}

you dont have to make any changes to your other service which use http

https://github.com/mtinner/CAS-FEE_Project2/blob/develop/src/frontend/components/common/authentication/auth-http.service.ts

https://github.com/mtinner/CAS-FEE_Project2/blob/ebab26fb8a8463cf9f65c3bc9e4d806d665bec7e/src/frontend/components/app.module.ts

Sign up to request clarification or add additional context in comments.

1 Comment

Is it works for you? I have 4.2.4 version of Angular and the same solution but the header is not added. An error in http.es5.js (Http.prototype.get function). Looks like it's related to github.com/angular/angular/issues/19260
0

Also from the version 4.3 of Angular you could use HttpInterceptor. More info from official documentation is here HttpInterceptor.

@Injectable()
export class AuthInterceptor implements HttpInterceptor {
 constructor(public auth: AuthService) {}

 intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
   request = request.clone({
     setHeaders: {Authorization: `Bearer ${this.auth.getToken()}`}
   });

   return next.handle(request);
  }
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.