【问题标题】:angular-7-interceptor-retry-requests-after-token-refreshangular-7-interceptor-retry-requests-after-token-refresh
【发布时间】:2020-04-19 21:57:38
【问题描述】:

我正在尝试为失败的请求实施拦截器,以防令牌过期。我尝试了多种方法,但仍然没有成功。

我参考了下面的 URL 并阅读了多个博客。每个人都建议切换地图方法,但不与我合作。 Angular 4 Interceptor retry requests after token refresh

我尝试将所有请求收集到 cachedRequests: Array> = []; 但不知道如何使用它来重新触发失败的请求。

this.next.handle(request) 在成功刷新令牌后不召回。我可以看到更新后的请求对象。

有人可以指出在 Angular 7 中引用的位置
"rxjs": "~6.3.3", "rxjs-compat": "^6.5.2", 实现拦截器。

以下是为我工作但仅获得令牌响应的代码

``````````
    handleError(request: HttpRequest<any>, next: HttpHandler, err) {
            if (err instanceof HttpErrorResponse) {
                if (err.status === 401) {
                    this.service.getNewToken().pipe(filter(token => token != null),
                        take(1),
                        switchMap((token: any) => {
                            console.log('token', token);
                            if (token && token.access_token && token.refresh_token) {
                                sessionStorage.setItem('accessToken', token.access_token);
                                sessionStorage.setItem('refreshToken', token.refresh_token);
                            }
                            request = this.addHeader(request);
                            request.headers.getAll('Authorization');
                            return next.handle(request);
                        })).subscribe(results => this.subject.next(results));

                }
            }
        }

`````````

更新 2:在尝试了多种方法后,我发现了

  1. 返回 next.handle(request);
  2. 返回 next.handle(request).subscribe();

感谢指点

【问题讨论】:

    标签: angular angular7 angular-http-interceptors


    【解决方案1】:

    回复晚了。我就是这样做的。

    也适用于并行请求。

    import { HttpInterceptor, HttpRequest, HttpHandler, HttpErrorResponse, HttpEvent, HttpResponse } from '@angular/common/http';
    import { Injectable } from '@angular/core';
    import { environment } from 'src/environments/environment';
    import { GlobalService } from './global.service';
    import { tap, mergeMap, switchMap, filter, take, flatMap, catchError } from 'rxjs/operators';
    import { Observable, Subject, throwError, of, BehaviorSubject } from 'rxjs';
    
    
    @Injectable()
    export class InterceptorService implements HttpInterceptor {
        private isRefreshing = false;
        private refreshTokenSubject: BehaviorSubject<any> = new BehaviorSubject<any>(null);
        constructor(public globalService: GlobalService) {
        }
    
        intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
            request = this.addHeader(request);
            // console.log('request ', request);
            return next.handle(request).pipe(catchError((error: any) => {
                if (error instanceof HttpErrorResponse) {
                    if (error.status === 401) {
                        if (!this.isRefreshing) {
                            this.isRefreshing = true;
                            this.refreshTokenSubject.next(null);
                            request = this.addHeader(request);
                            console.log('Token request');
                            return this.globalService.getRefershToken().pipe(
                                switchMap((token: any) => {
                                    console.log('inside token');
                                    this.isRefreshing = false;
    
                                    if (token && token.access_token && token.refresh_token) {
                                        sessionStorage.setItem('accessToken', token.access_token);
                                        sessionStorage.setItem('refreshToken', token.refresh_token);
                                    }
                                    // request = this.addHeader(request);
                                    // console.log('request: ', request);
                                    this.refreshTokenSubject.next(token);
                                    return next.handle(this.addHeader(request));
                                }));
    
                        } else {
                            console.log('inside else call');
                            console.log('token : ', this.refreshTokenSubject.getValue());
                            return this.refreshTokenSubject.pipe(
                                filter(token => (token != null && token != undefined)),
                                take(1),
                                switchMap(() => {
                                    console.log('adding header in else');
                                    return next.handle(this.addHeader(request))
    
                                }));
                        }
                    }
                }
            }));
        }
    
        private addHeader(request: HttpRequest<any>) {
            let getEndPoint = request.url.split('/')[request.url.split('/').length - 1];
            if (getEndPoint !== 'refreshToken') {
                const accessToken = sessionStorage.getItem('accessToken');
                request = request.clone({
                    setHeaders: {
                        Authorization: `Bearer ${accessToken}`
                    }
                });
            } else if (getEndPoint === 'refreshToken') {
                const refreshToken = sessionStorage.getItem('refreshToken');
                request = request.clone({
                    setHeaders: {
                        applicationCode: environment.applicationCode,
                        'refresh-token': `${refreshToken}`,
                    }
                });
            }
            return request;
        }
    }
    

    【讨论】:

    • 这就像一个魅力。
    猜你喜欢
    • 2020-10-24
    • 2020-10-11
    • 1970-01-01
    • 2019-02-18
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    相关资源
    最近更新 更多