1

我对刷新令牌的流程有疑问。

我尝试将此称为令牌。令牌已过期并发出第二次请求以刷新令牌。我正在接受响应并使用新令牌重新运行请求。

一切都很完美,直到我尝试使用相同的无效令牌发出多个并行请求。

问题是,如果我使用相同的令牌进行 3 次并行调用,那么第一次调用会使令牌对其他 2 次调用无效..

我在流程上做错了吗?

import {Injectable} from '@angular/core';
import {Request, XHRBackend, RequestOptions, Response, Http, RequestOptionsArgs, Headers} from '@angular/http';
import {Observable} from 'rxjs/Observable';
import {Router} from '@angular/router';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';
import {RefreshTokenService} from "../services/refreshToken.service";

@Injectable()
export class HttpService extends Http {

constructor(
    backend: XHRBackend,
    options: RequestOptions,
    private refreshTokenService?: RefreshTokenService,
    private router?: Router
) {
    super(backend, options);
}

request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {

    if (typeof url === 'string') {
        if (!options) {
            options = {headers: new Headers()};
        }
        this.setHeaders(options);
    } else {
        this.setHeaders(url);
    }

    return super.request(url, options).catch(this.catchErrors(url, options));
}

private catchErrors(url: string | Request, options?: RequestOptionsArgs) {
    return (res: Response) => {

        if (res.status === 401 || res.status === 403) {


            if ( this.refreshTokenService.wait === false ) {

                this.refreshTokenService.wait = true;
                return this.refreshTokenService.refreshToken(localStorage.getItem('JWToken'))
                    .flatMap((result: any) => {
                        // if got new access token - retry request
                        if (JSON.parse(result._body).token) {
                            localStorage.setItem('JWToken', JSON.parse(result._body).token);
                            this.setHeaders(url);
                            this.refreshTokenService.wait = false;
                            return this.request(url, options);
                        } else {
                            return Observable.throw(new Error('Can\'t refresh the token'));
                        }

                    })
            } else {
                // TODO... return this only if new token is ok
                this.setHeaders(url);
                return this.request(url, options);
            }
        } else {
            Observable.throw(res);
        }
    };
}

private setHeaders(objectToSetHeadersTo: Request | RequestOptionsArgs) {
    // add whatever header that you need to every request
    objectToSetHeadersTo.headers.set('Authorization', 'Bearer ' + localStorage.getItem('JWToken'));
}


}
4

0 回答 0