我目前正在做一个Angular + Symfony WebApp。我的令牌拦截器是这样做的
@Injectable()
export class TokenInterceptor implements HttpInterceptor {
// for avoiding entering an infinite loop
private isRefreshing = false;
constructor(private _authService: AuthService) { }
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (this._authService.getJwtToken()) {
request = this.setToken(request, this._authService.getJwtToken()!);
}
return next.handle(request).pipe(
catchError(error => {
if (error instanceof HttpErrorResponse && error.status === 401 && this._authService.getJwtRefreshToken()) {
return this.handleAuthorizationError(request, next);
} else {
return throwError(() => error);
}
})
);
}
private setToken(request: HttpRequest<any>, token: string): HttpRequest<any> {
return request.clone({ setHeaders: { Authorization: `Bearer ${token}` } });
}
private handleAuthorizationError(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (!this.isRefreshing) {
this.isRefreshing = true;
return this._authService.refreshJwtToken().pipe(
switchMap((token: JwtToken) => {
this.isRefreshing = false;
this._authService.setJwtToken(token);
return next.handle(this.setToken(request, token.token));
}
)
);
} else {
this.isRefreshing = false;
return next.handle(request);
}
}
}
目前我在Symfony中的token_ttl设置为84600(用于1D)。
我尝试刷新我的令牌,即使我的主令牌已过期。但是,当我的令牌过期时,我的刷新令牌也会过期。
我怎样才能解决我的问题,以保持一个恒定的身份验证每个http请求,即使用户没有连接像2个星期前?
我应该延长refresh_token的有效期吗?如何延长?
谢谢!
1条答案
按热度按时间s5a0g9ez1#
发现问题:
Symfony在URL操作本身之前检查JWT令牌过期,即使在security.yaml中设置了PUBLIC_ACCESS。
因此,如果JWT令牌到期,我必须删除Authorization头,如下所示:
希望这对某人有用:)