Estamos utilizando el cliente JavaScript @microsoft/signalr en nuestra interfaz de Vue para establecer una conexión websocket con nuestro backend (.net core). Además, usamos un token de portador para la autenticación.
Este es el generador de conexiones en la interfaz:
this.connection = new HubConnectionBuilder() .withUrl('/chat', { accessTokenFactory: () => IdService.getToken() }) .configureLogging(LogLevel.Information) .withAutomaticReconnect() .build()Luego comienzo la conexión en este código:
HubService.connection.start().then(() => { console.log('Connection started') }).catch(err => { console.error(err) })Mi problema es que, cuando el token de Bearer caduca en el backend, al volver a conectarme aparece un error 401 en el frontend, que es correcto y quiero responder correctamente a este error. Puedo detectar el error en el bloque catch de la función de inicio, pero no sé cómo manejar el error porque no puedo leer un código de estado de la solicitud como en una solicitud HTTP normal. Es solo un mensaje de error del cliente Signalr. Por supuesto, podría buscar en la cadena '401', pero eso parece incorrecto.
Error: no se pudo iniciar la conexión: Error: no se pudo completar la negociación con el servidor: Error: no autorizado: código de estado '401'
Me gustaría saber en qué parte de mi código y cómo manejar adecuadamente este tipo de error y otros errores. Cualquier ayuda o ideas son apreciadas.
La forma correcta de hacerlo es que su IdService.getToken() obtenga un token actualizado cuando esté a punto de caducar porque en la documentación de Microsoft se dice que se llama a esta función cada vez que hay una comunicación del cliente al concentrador.
La función de token de acceso que proporciona se llama antes de cada solicitud HTTP realizada por SignalR. Si necesita renovar el token para mantener activa la conexión (porque puede caducar durante la conexión), hágalo desde esta función y devuelva el token actualizado.
Hay muchos ejemplos en los que los proveedores de tokens actualizan el token cuando está a punto de caducar.
Pero si esa corrección/implementación está fuera de su alcance/control, lo único que puede hacer es capturar la excepción e inicializar nuevamente la conexión. Algo como esto:
Pero esta es una solución al problema original, que es la función de actualización de token adecuada.