Angular 4.3 HttpInterceptor:如何重新发送请求?

时间:2017-08-03 13:31:36

标签: angular http interceptor

我有一个HttpInterceptor,它为每个http请求添加一个JWT标记。现在我希望对401响应作出反应,这将在令牌过期后立即发生。

有些事情:

  1. 发送请求
  2. 401回归
  3. 弹出登录表单,用户输入他的凭据
  4. 如果登录成功,则保存新令牌
  5. 使用新令牌
  6. 再次发送原始httpRequest

    到目前为止,这就是我所拥有的:

    // Imports [...]
    
    @Injectable()
    export class MyHttpInterceptor implements HttpInterceptor {
    
        constructor(private logger: LoggingService, private injector: Injector) { }
    
        intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    
            // Handle request
            const authService = this.injector.get(AuthService);
            const authToken = authService.getToken();
    
            if (authToken) {
                request = request.clone({
                    setHeaders: {
                        Authorization: `Bearer ${authService.getToken()}`
                    }
                });
            }
    
            // Handle response
            return next.handle(request)
                .do(event => {
                    if (event instanceof HttpResponse) {
                        this.logger.logDebug(event);
                    }
                })
                .catch((err: HttpErrorResponse) => {
    
                    if (err.status === 401) {
                        // MISSING IMPLEMENTATION HERE   
                    } else {
                        this.logger.logError(this.extractErrorMessage(err));
                    }
    
                    return Observable.throw(err);
                });
        }
    
        private extractErrorMessage(err: HttpErrorResponse): string {
            return err.error && err.error.devMessage ? err.error.devMessage : err.message;
        }    
    }
    

    在我继续之前,我有一些疑惑:

    1. 是否可以按原样重新发送请求,还是必须使用HttpClient的方法(GET,POST ..)?
    2. 将HttpClient注入HttpInterceptor是明智的吗?是否存在无限循环的风险?
    3. 这是正确的方法吗?
    4. 或者,我想在使用像Auth0的angular2-jwt这样的库发送每个http请求之前检查客户端令牌的有效性。这样,我不必重新发送请求,我只需要使用新令牌更新其标头。

      对我来说,这看起来像一个更干净的解决方案,尽管每次都需要额外的时间来验证令牌。

      欢迎任何想法。

0 个答案:

没有答案