Para responder a sus preguntas:
1) ¿Cómo maneja una situación con un secreto de token comprometido que se comparte entre un cliente y el servidor?
Añade una fecha de caducidad a tu token. Asegúrese de que el token no se pueda utilizar después de la fecha de caducidad. Pero esto no impide el acceso no autorizado dentro del período de caducidad del token.
Por lo tanto, para superar este problema, puede incrustar la dirección IP del cliente u otra información similar dentro del token. Y asegúrese de que la solicitud entrante con el token se utilice desde la misma dirección IP a la que se emitió.
2) ¿Cierra la sesión en todos sus clientes y define un nuevo secreto de token para futuras solicitudes? (eso sería una mala experiencia)
Si quiere cerrar sesión en todos los clientes que usan múltiples tokens de una manera autorizada, entonces No. Puede continuar usando múltiples tokens al mismo tiempo, siempre que tenga un período de caducidad finito para los tokens. Esto asegura que su token se utilice dentro de la ventana de tiempo prevista.
Pero, si te refieres a cuándo se roban el token y de alguna manera lo descubriste. Es mejor invalidar todos los tokens para ese usuario.
Sin embargo, es posible que desee tener un mecanismo que revoque todos los tokens explícitamente en casos especiales. Puede ser como cuando el usuario restablece su contraseña porque cree que su contraseña puede estar comprometida.
3) ¿Hay una manera de simplemente cerrar sesión en el cliente comprometido?
Puede ser, depende de su capacidad para identificar con precisión qué token se ha comprometido. Lo que puede llevar a que todos los clientes usen ese token para perder el acceso. Pero, no lo recomendaría. Pero, oye, siempre puedes escribir código que se vuelva a autenticar dinámicamente y obtener un nuevo token de acceso cuando el cliente anterior ya no pueda usar el token. :-)
No tenga miedo de invalidar un token cuando sea necesario. Si pierde un token, escriba un script dinámico para volver a autenticarse. Si cree que puede perder los detalles de la sesión cuando use un token nuevo, vuelva a enviar el token caducado al servidor mientras se vuelve a autenticar. Usando este token caducado, puede reconstruir un token nuevo con los detalles de la sesión del token anterior. Siempre que haya incrustado los detalles de la sesión en el token caducado.