リフレッシュトークン戦略を使用して認証としてJWTを使用しており、トークンをヘッダーとして送信する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の演算子と関係があることはわかっていますが、これは少し新しくなっています。