En esta parte del proyecto tiene como objetivo permita a los usuarios registrarse, iniciar sesión y acceder a un área privada con información personalizada. La aplicación está construida con React, utiliza Firebase para la autenticación de usuarios y comunica con una API para gestionar datos adicionales.
- Frontend: React, React Router, JSX, CSS
- Backend: Firebase (para la autenticación)
- API: Integración de API para la gestión de datos de usuarios y otros recursos del proyecto
- Control de estado: React Context API para manejar el estado global de la autenticación
La autenticación en este proyecto se gestiona a través de Firebase Authentication, que proporciona una forma sencilla de autenticar usuarios utilizando correo electrónico y contraseña.
Se configuró Firebase en el archivo /src/config/firebase.js
. Este archivo contiene las claves de acceso a Firebase y la configuración necesaria para interactuar con los servicios de autenticación.
import { initializeApp } from "firebase/app";
import { getAuth } from "firebase/auth";
const firebaseConfig = {
apiKey: "TU_API_KEY",
authDomain: "tu-app.firebaseapp.com",
projectId: "tu-app",
storageBucket: "tu-app.appspot.com",
messagingSenderId: "tu-messaging-id",
appId: "tu-app-id",
};
const app = initializeApp(firebaseConfig);
const auth = getAuth(app);
export { auth };
Para el registro de nuevos usuarios, creamos un formulario donde los usuarios pueden ingresar su correo electrónico, contraseña y otros detalles. Utilizamos la función createUserWithEmailAndPassword
de Firebase para registrar a los usuarios:
import { createUserWithEmailAndPassword } from "firebase/auth";
import { auth } from "../config/firebase";
const handleRegister = async (email, password) => {
try {
await createUserWithEmailAndPassword(auth, email, password);
console.log("Usuario registrado");
} catch (error) {
console.error("Error al registrar usuario:", error.message);
}
};
El inicio de sesión se maneja a través de la función signInWithEmailAndPassword
de Firebase. Esta función permite a los usuarios autenticarse con su correo electrónico y contraseña.
import { signInWithEmailAndPassword } from "firebase/auth";
import { auth } from "../config/firebase";
const handleLogin = async (email, password) => {
try {
await signInWithEmailAndPassword(auth, email, password);
console.log("Usuario autenticado");
} catch (error) {
console.error("Error al iniciar sesión:", error.message);
}
};
La autenticación de usuarios se maneja a través del UserContext
. Este contexto se usa para compartir el estado de autenticación (si el usuario está logueado o no) entre los diferentes componentes.
import { createContext, useState, useEffect } from "react";
import { auth } from "../config/firebase";
import { onAuthStateChanged } from "firebase/auth";
export const UserContext = createContext();
export const UserProvider = ({ children }) => {
const [user, setUser] = useState(null);
useEffect(() => {
const unsubscribe = onAuthStateChanged(auth, (currentUser) => {
setUser(currentUser);
});
return () => unsubscribe();
}, []);
return (
<UserContext.Provider value={{ user }}>
{children}
</UserContext.Provider>
);
};
En este proyecto, también se integró una API para la gestión de recursos. Esta API se consume de manera asíncrona utilizando fetch
o bibliotecas como axios
para realizar solicitudes HTTP.
La comunicación con la API se maneja de forma asíncrona utilizando funciones async/await
en combinación con fetch
. A continuación se muestra un ejemplo de cómo obtener datos de la API:
export const loaderMenu = async () => {
const response = await fetch(`https://www.freetestapi.com/api/v1/cars`);
if (!response.ok) {
throw new Error(`Error: ${response.statusText}`);
}
const data = await response.json();
return data;
};
En este caso, la función fetchData
realiza una solicitud GET a la API, y una vez que los datos son recibidos correctamente, se procesan en formato JSON.
El proyecto utiliza React Router para gestionar la navegación entre las diferentes vistas de la aplicación. Dependiendo de si el usuario está autenticado, se le redirige a una vista específica.
- Las rutas públicas incluyen las páginas de Login y Register.
- Las rutas privadas, como la página de Menu, requieren que el usuario esté autenticado. Esto se controla mediante un componente de Layout Privado que redirige a los usuarios no autenticados al inicio de sesión.
Ejemplo de protección de rutas privadas:
import { Navigate, Outlet } from "react-router-dom";
import { useContext } from "react";
import { UserContext } from "../context/UserContext";
const LayoutPrivado = () => {
const { user } = useContext(UserContext);
return (
<div>
<h1>Layout Privado</h1>
{user ? <Outlet /> : <Navigate to="/login" />}
</div>
);
};
En este caso, si el usuario no está autenticado, se redirige automáticamente a la página de inicio de sesión.
La integración de Firebase y la comunicación asíncrona con la API han sido fundamentales para la construcción de una aplicación que permite gestionar usuarios de manera eficiente. La estructura del proyecto sigue el patrón de Componentes de Función de React, y la gestión del estado se realiza utilizando React Context para almacenar información sobre el estado de autenticación del usuario.
Se ha logrado una implementación exitosa de:
- Registro e inicio de sesión con Firebase.
- Protección de rutas privadas.
- Comunicación asíncrona con la API para la obtención de datos.
Este es solo un esquema básico, y se pueden seguir añadiendo más características como la gestión de errores más robusta, validación de formularios, etc., para mejorar la experiencia del usuario.