使用SYMFONY/LexitJWT和Angular处理刷新令牌

j2cgzkjk  于 2023-02-09  发布在  Angular
关注(0)|答案(1)|浏览(141)

我目前正在做一个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的有效期吗?如何延长?
谢谢!

s5a0g9ez

s5a0g9ez1#

发现问题:
Symfony在URL操作本身之前检查JWT令牌过期,即使在security.yaml中设置了PUBLIC_ACCESS。
因此,如果JWT令牌到期,我必须删除Authorization头,如下所示:

private setToken(request: HttpRequest<any>, token: string): HttpRequest<any> {
        if ( this._authService.isTokenExpired() ) {
          return request;
        }
        return request.clone({ setHeaders: { Authorization: `Bearer ${token}` } });
    }

希望这对某人有用:)

相关问题