我对刷新令牌的流程有疑问。
我尝试将此称为令牌。令牌已过期并发出第二次请求以刷新令牌。我正在接受响应并使用新令牌重新运行请求。
一切都很完美,直到我尝试使用相同的无效令牌发出多个并行请求。
问题是,如果我使用相同的令牌进行 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'));
}
}