Как обработать ошибку 401 без проверки подлинности в Angular 6 - PullRequest
0 голосов
/ 17 сентября 2018

Мне нужно перейти на страницу входа, пока моя служба данных отвечает на статус 401 (не прошедший проверку подлинности). Вот мой код

get_data(url,auth=true){
        //......url : url path......
        //....auth : true api auth required,false no api required....
        var get_url = API_URL + url;
        var headers = new Headers();
        headers.append('Content-Type', 'application/json');
        headers.append('Accept', 'application/json');
        if(auth==true){
            var localStore =    JSON.parse(localStorage.getItem('currentUser'));
            if (localStorage.getItem("currentUser") != null) {
                headers.append("Authorization", "Bearer " + localStore.token);
            }else{
                headers.append("Authorization", "Bearer ");
                //this.router.navigate(['/login']);
            }
        }
        let options = new RequestOptions({ headers });
        return this.http.get(get_url, options) .pipe((map(res => res.json())));
    }

1 Ответ

0 голосов
/ 17 сентября 2018

Разрешить создание перехватчика http в угловом формате для управления действием при отправке запроса и получении ответа.

http.interceptor.ts

import { throwError as observableThrowError, Observable } from 'rxjs';
import { catchError } from 'rxjs/operators';
import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpResponse } from '@angular/common/http';
import { Injectable, ErrorHandler } from '@angular/core';
import { UserStore } from '../store/user.store';
import { Router } from '@angular/router';
import * as HttpStatus from 'http-status-codes';

@Injectable()
export class SimpleHttpInterceptor implements HttpInterceptor {

  constructor(private router: Router, private userStore: UserStore) {
  }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    req = this.addAuthentication(req);
    return next.handle(req).pipe(catchError((err) => {
      if (err.status === HttpStatus.UNAUTHORIZED) {
        this.router.navigate(['/login']); //go to login fail on 401
      }
      return observableThrowError(err);
    }));
  }

  //here you add the bearer in every request
  addAuthentication(req: HttpRequest<any>): HttpRequest<any> {
    const headers: any = {};
    const authToken = this.userStore.getToken(); // get the token from a service
    if (authToken) {
      headers['authorization'] = authToken; // add it to the header
      req = req.clone({
        setHeaders: headers
      });
    }
    return req;
  }
}

Затем вы можете зарегистрировать его впример модуля

@NgModule({
  imports: [
    HttpClientModule
  ],
  exports: [
    HttpClientModule
  ],
  providers: [
    { provide: HTTP_INTERCEPTORS, useClass: UcmsHttpInterceptor, multi: true }
  ],
})
export class RestModule {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...