Angular 4.3-HTTP拦截器-刷新JWT令牌

问题描述 投票:6回答:4

我需要对403禁止的HTTP状态(以获取/刷新)JWT令牌做出反应(在拦截器类中,并使用新鲜令牌重试该请求。

在下面的代码中,当服务器返回错误响应时,它将转到成功回调(不像我期望的那样进入错误回调),并且该事件是typeof对象(对错误响应的响应没有用)。事件对象如下所示:{type:0}。

问题:

-如何正确处理httpErrorResponse(禁止使用403)当我需要刷新accessToken并重试http请求时,使用HttpInterceptor?

 import {
  HttpInterceptor,
  HttpRequest,
  HttpResponse,
  HttpHandler,
  HttpEvent
} from '@angular/common/http';
import 'rxjs/add/operator/map';

@Injectable()
class JWTInterceptor implements HttpInterceptor {

  constructor(private tokenService: TokenService) {}
  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
  let myHeaders = req.headers;
  if (this.tokenService.accessToken) {
        myHeaders = myHeaders.append('Authorization',`${this.tokenService.accessToken.token_type} ${this.tokenService.accessToken.access_token}`)
   }

  const authReq = req.clone({headers: myHeaders});

    return next.handle(authReq).map((event: HttpEvent<any>) => {
      if (event instanceof HttpResponse) {
        // success callback
      }
    }, (err: any) => {
      if (err instanceof HttpErrorResponse {
        if (err.status === 403) {
          // error callback
          this.tokenService.obtainAccessToken()
        }
      }
    })
      .retry(1);
  }
}
angular error-handling jwt angular-http-interceptors
4个回答
8
投票

我对这个问题的最终解决方案:


4
投票

您需要从RxJS添加catch运算符。这是错误的出处,您可以相应地进行处理。


3
投票

只想分享对我有用的东西:


0
投票
import { Injectable } from '@angular/core';
import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http';
import { Observable } from 'rxjs';

@Injectable()
export class JwtInterceptor implements HttpInterceptor {
    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        // add authorization header with jwt token if available
        const currentUser = JSON.parse(sessionStorage.getItem('currentUser'));
        console.log('Interceter called');
        console.log(currentUser);
        //  const re = 'https://newsapi.org';
        const re = '/user';
        if (request.url.search(re) === -1) {

            if (currentUser && currentUser.token) {
                console.log('Token is being added....!!!!!');
                // console.log(currentUser.token);
                request = request.clone({
                    setHeaders: {
                        Authorisation: `Token ${currentUser.token}`,
                    }
                });
            }
            console.log('Request Sent :');
            console.log(request);
        }
        return next.handle(request);
    }
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.