我使用带有刷新令牌策略的 JWT 作为身份验证,并且我的 Angular 客户端中有一个拦截器,它将令牌作为标头发送。
我在发送之前检查是否过期,并在需要时使用我的refreshToken刷新令牌。
问题是当发送 2 个(或更多)请求时,两个请求都尝试刷新令牌。我需要一个函数,它发送刷新令牌请求,并且在一次多次调用时,仅向服务器发出 1 个 http 请求进行刷新,并将新更新的令牌返回给所有调用它的人。
这是我的拦截器:
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const authService = this.inj.get(AuthService);
const token = authService.getToken();
// if no token or this is a refresh token req
if (!token || req.url.split('/').pop() === 'refreshToken') {
return next.handle(req);
}
const decoded = jwt.decode(token);
// if token expired
if (decoded.exp < (Date.now() / 1000)) {
return authService.refreshJWTToken().concatMap((newToken) => {
const clonedReq = req.clone({
headers: req.headers.set('Authorization', 'JWT ' + newToken)
});
return next.handle(clonedReq);
});
}
const clonedReq = req.clone({ headers: req.headers.append('Authorization', 'JWT ' + token) });
return next.handle(clonedReq);
}
我需要的功能是authService.refreshJWTToken();
我知道这与 Observables 运算符有关,但我对此有点陌生。
好吧,读完这篇文章后我明白了:https://www.intertech.com/Blog/angular-4-tutorial-handling-refresh-token-with-new-httpinterceptor/ https://www.intertech.com/Blog/angular-4-tutorial-handling-refresh-token-with-new-httpinterceptor/
我的函数如下所示(也处理请求):
handleRefreshToken(req: HttpRequest<any>, next: HttpHandler): Observable<any> {
const authService = this.inj.get(AuthService);
if (!this.isRefreshingToken) {
this.isRefreshingToken = true;
// Reset here so that the following requests wait until the token
// comes back from the refreshToken call.
authService.tokenSubject.next(null);
return authService.doRefreshToken()
.switchMap((newToken: string) => {
authService.tokenSubject.next(newToken);
return next.handle(this.addToken(req, newToken));
})
.catch(err => {
authService.logout();
return Observable.throw(err);
})
.finally(() => {
this.isRefreshingToken = false;
});
} else {
return authService.tokenSubject
.filter(token => token != null)
.take(1)
.switchMap(token => {
return next.handle(this.addToken(req, token));
});
}
}
感谢 Vadim(阴道)Siomin 的帮助!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)