El contexto se reinicia a nulo cuando la URL del navegador se cambia manualmente.
He creado AuthContext
que mantiene al usuario actualmente registrado:
// auth-context.ts
export interface IAuthContext {
auth: IMe | null;
setAuth: (user: IMe | null) => void;
}
const AuthContext = React.createContext<iauthcontext>({
auth: null,
setAuth: (auth: IMe | null) => {}
});
export default AuthContext;
El componente principal simplificado App
en el que uso el proveedor de contexto se ve así:
const App: FC = () => {
const [auth, setAuth] = useState<ime |="" null="">(null); // línea problemática
return (
<authcontext.provider value="{{auth," setauth}}="">
<browserrouter>
<routes>
<route path='/' element=""></route><main></main>}/>
<route path="/login" element=""></route><login></login>}/>
<route path="/register" element=""></route><register></register>}/>
<route path="/about" element=""></route><about></about>}/>
</routes>
</browserrouter>
</authcontext.provider>
);
}
En general, la aplicación funciona bien.
Sin embargo, cuando navego por la aplicación mediante cambios manuales de URL en el navegador web, seguidos de presionar la tecla Enter (es decir, refrescar la página), entonces hay un problema con el restablecimiento del contexto de autenticación a null…
Creo que cuando cambio la URL manualmente, todo el componente App
se vuelve a renderizar y, por lo tanto, el estado de AuthContext
se restablece a null debido a la línea problemática.
La idea es que el componente Login
utiliza setAuth
dentro de él después de que se resuelve de manera positiva la promesa relacionada con el formulario.
¿Alguna sugerencia de cómo puedo protegerme de ese problema de volver a renderizar y, por lo tanto, de que el contexto se restablezca al valor predeterminado de null? Creo que este escenario es algo básico, pero soy principiante en cosas de frontend. ¡Gracias!
davy.ai
Una solución a este problema es hacer uso de la API
localStorage
del navegador para persistir el estado deauth
en las actualizaciones de la página.Puede actualizar la línea de
useState
en el componenteApp
de la siguiente manera:Esto inicializará el estado
auth
con el valor almacenado enlocalStorage
si existe, de lo contrario se inicializará connull
.Luego, cada vez que se llame a la función
setAuth
, puede actualizar el valor enlocalStorage
también para persistir los datos:Con estos cambios, el estado
auth
se almacenará de manera persistente en ellocalStorage
del navegador en las actualizaciones de la página, asegurando que el usuario siga conectado incluso después de cambiar manualmente la URL.Nota: Esta solución presenta posibles riesgos de seguridad si se almacena información confidencial en el estado
auth
. En ese caso, es posible que desee considerar el uso de otros métodos más seguros para almacenar información confidencial, como la gestión de sesiones en el lado del servidor o tokens de acceso JSON (JWTs).