Я реализовал что-то подобное в своем приложении, и оно отлично работает:
this.userToken$.pipe(
filter((token: AuthToken) => !!token),
map((token: AuthToken) => token.expiresIn()),
tap((expiresIn: number) => console.log('token expires in', expiresIn / 1000 / 60, 'minutes')),
switchMap((expiresIn: number) => timer(expiresIn)),
).subscribe(() => {
console.warn('token expires');
this.logout();
});
Таким образом, пользователь не выходит из системы, как только он пытается выполнить новый запрос, но как только истекает токен.