Angular:刷新令牌只有一次

我正在使用JWT刷新令牌策略作为身份验证,并且在我的Angular客户端中有一个拦截器将令牌作为标头发送。Angular:刷新令牌只有一次

我在发送之前检查过期时间,并在需要时使用我的refreshToken刷新令牌。

问题是发送2个(或更多)请求时,都尝试刷新令牌。我需要一个函数,它发送刷新令牌的req,并且一次调用多次,只向服务器发送1个http req以进行刷新,并将新的更新的令牌返回给所有调用它的人。

这是我的拦截器:

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/

我的功能看起来像这样(也处理REQ):

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));

});

}

}

由于瓦迪姆(在vagin)Siomin的帮助!

以上是 Angular:刷新令牌只有一次 的全部内容, 来源链接: utcz.com/qa/263400.html

回到顶部