You don't have access to this class

Keep learning! Join and start boosting your career

Aprovecha el precio especial y haz tu profesión a prueba de IA

Antes: $249

Currency
$209
Suscríbete

Termina en:

1 Días
5 Hrs
19 Min
46 Seg

Code review: Protección de Rutas

7/9
Resources

Contributions 13

Questions 1

Sort by:

Want to see more contributions, questions and answers from the community?

Es mejor encapsular las rutas en su propio archivo y no mezclar lógica de vistas o la misma vista en si.

Asi se ven en su propio archivo.

Quedando mas limpio nuestro app.jsx:

💡 El estar repitiendo si la cuenta existe y si esta logeado en cada lado no es bueno, imagina que luego debes cambiar algo y te toca ir a todos los archivos a cambiar lo mismo. Es mejor dejar eso en el contexto de la aplicación. 💡

yo preferí permitir que el usuario pudiera ver los elementos, las rutas que protegí fueron las de cuando el usuario está con su sesión activa!

Hola, tengo una duda, quisiera hacer rutas dinámicas sin embargo no lo he logrado, el código es el siguiente: (al final hace cosas raras y no termina por tomar las rutas bien) ![](https://static.platzi.com/media/user_upload/carbon-c9fb9275-8a70-4871-8939-dedfd665c9bf.jpg)
Yo cree una funcion en el contexto que retorna los dos valores y asi no repito tanto el codigo ![](https://static.platzi.com/media/user_upload/image-c66ac4e8-ea93-4735-b10c-ced4c924434a.jpg)

Les comparto como decidí realizar la protección de rutas. Primero realiza el ejercicio y una vez hecho ahora sí mira esta implementación 😀.
 

  • En primer lugar decidí permitirle el acceso al usuario a la ruta Home y con sus categorias. El resto de rutas (ordenes, mi cuenta, luego del checkout…) sí están protegidas.
  • Dejé de usar el hook useRoutes e importé Routes y Route de react.
  • Organicé las rutas como normalmente lo haría con estas librerías importadas.
  • Creé el componente PrivateRoutes usando Outlet y Navigate de react-router-dom. En este es en donde debemos de colocar nuestro condicional del cual dependerán las rutas protegidas (en este caso decidí depender del signOut state. Si dicho estado es true entonces navegar a ‘sign-in’, si es false entonces Outlet (que puede acceder a las rutas children)).
  • Importé este componente PrivateRoutes en App y lo usé con Route como podrás ver a continuación, dejando como children de este componente aquellas rutas que quiero proteger.
     
    // PrivateRoutes.jsx

     
    // App.jsx
¡Hola a todos! 👋 Quiero compartirles que la API original del curso está rota, lo que puede dificultar completar los ejercicios. Para ayudarles, he creado una versión funcional del proyecto base con una nueva API y código actualizado. 🚀 Pueden clonar este repositorio para seguir el curso sin problemas: 👉 <<https://github.com/darubiomunoz/prueba-tecnica-reactjs>> Además, si les resulta útil, no olviden darle una estrella ⭐ al repositorio y seguirme en GitHub. ¡Espero que les sea de ayuda y puedan completar el curso con éxito! 💚 ¡Happy coding! 💻
## ✨🦄 Para la protección de rutas Creé dos componentes nuevos, uno que comprueba que exista un usuario autenticado, y el otro que comprueba que ningún usuario está autenticado. Esto debido a que hay vistas que no se deben mostrar cuando un usuario está autenticado o no, pero también existen vistas que solo se deben mostrar cuando el usuario no está autenticado, como el login o el sign out. Así quedó mi estructura de rutas: ![](https://static.platzi.com/media/user_upload/image-9b6cd627-194b-416d-904c-877bf91f45b5.jpg) Y esta es la manera en que funciona uno de los dos componentes que mencioné ![](https://static.platzi.com/media/user_upload/image-636819b8-2b69-45fc-af90-5b481e4d0fc5.jpg)
para lo de las rutas, yo hice otro componente y manejar de esta manera la logica ![](https://static.platzi.com/media/user_upload/image-1e8008ad-44ce-41d7-9049-0654295b620f.jpg)
En mi caso para que se viera mas lindo y que apenas dentren a la aplicación de una no vieran nada muestro en home con un blanco por delante al 60% y si le dan click a cualquier parte de este lo redireccione a crear cuenta, la creamos y podemos ver todo ![](https://static.platzi.com/media/user_upload/image-6549f863-b6f7-486d-ad41-73c177cb8769.jpg)![](https://static.platzi.com/media/user_upload/image-c46487a2-f434-40eb-8a01-fe68813f28f5.jpg)![](https://static.platzi.com/media/user_upload/image-bd05a0a1-4bed-4e0e-8d61-893419d287a0.jpg)![](https://static.platzi.com/media/user_upload/image-ff17a8fd-5156-4e84-9aaf-0a8cd9ea568c.jpg)
Mi métodos para proteger las rutas son : 1-En el NavBar elimine el componente Link si mi usuario no esta logeado, logrando así eliminar esa interacción. ![](https://static.platzi.com/media/user_upload/image-047e4a39-8a30-4d3d-9d13-cd248fe874d9.jpg) 2-En el App, si el usuario no esta logeado redireccione todos los endpoints hacia \<SignIn/>. Esto lo hice por que si el usuario cambiaba el endpoint desde su navegador podía visualizar de igual manera la página . ![](https://static.platzi.com/media/user_upload/image-b9807bcc-20f6-438d-86e7-eb9aa28dd15b.jpg) Lo que veo de malo en mi solución es que repito mucho código fallando así en el principio de DRY.
Use un custom Hook que usa useReducer para manejar el estado global, y useContext para enviar la información del usuario autenticado, ademas de una funcion requireAuth para comprobar el estado global y la autentocación del usuario y redirigir a las rutas correspondientes. ```js import { useRoutes, BrowserRouter } from 'react-router-dom' import Home from '../Home'; import MyAccount from '../MyAccount'; import MyOrder from '../MyOrder'; import MyOrders from '../MyOrders'; import NotFound from '../NotFound'; import SignIn from '../SignIn'; import Navbar from '../../Components/Navbar'; import CheckoutSideMenu from '../../Components/CheckoutSideMenu' import './App.css' import { ShoppingCartProvider } from '../../Context'; import { AuthProvider, RequireAuth } from '../../Context/useAuth'; import SignUpPage from '../SignUp'; const AppRoutes = ()=>{ let routes = useRoutes([ {path:'/',element: <Home/>}, {path:'/clothes',element: <Home/>}, {path:'/electronics',element: <Home/>}, {path:'/furnitures',element: <Home/>}, {path:'/toys',element: <Home/>}, {path:'/others',element: <Home/>}, {path:'/my-account',element: <RequireAuth><MyAccount/></RequireAuth>}, {path:'/my-order',element: <RequireAuth><MyOrder/></RequireAuth>}, {path:'/my-orders',element: <RequireAuth><MyOrders/></RequireAuth>}, {path:'/my-order/last',element: <RequireAuth><MyOrder/></RequireAuth>}, {path:'/my-order/:id',element: <RequireAuth><MyOrder/></RequireAuth>}, {path:'/sign-in',element: <SignIn/>}, {path:'/sign-up',element: <SignUpPage/>}, {path:'/*',element: <NotFound/>}, ]); return routes; } function App() { return ( <BrowserRouter> <AuthProvider> <ShoppingCartProvider> <AppRoutes/> <Navbar/> <CheckoutSideMenu></CheckoutSideMenu> </ShoppingCartProvider> </AuthProvider> </BrowserRouter> ) } export default App; ```
Les comparto la estrategia que use para proteger las rutas, me parece más sencilla de implementar y mantener. Lo Primero fue modificar las rutas: ![](https://static.platzi.com/media/user_upload/Captura%20de%20pantalla%202024-02-17%20193230-4c185b2d-8c60-4990-afa8-81c9e30f507c.jpg) Entonces puse un elemento sin ruta llamado ProtectedRoutes, y dentro como hijos puse todas las rutas que deberían estar protegidas. Por fuera de este elemento deje las rutas no protegidas, sign-in y la de notFound. En el componente ProtectedRoutes puse el siguiente código: ![](https://static.platzi.com/media/user_upload/Captura%20de%20pantalla%202024-02-17%20193653-04e86e18-08c5-478c-8298-ef2199d9a249.jpg) Acá traigo del contexto el booleano que me indica si el usuario está logueado o no, y dependiendo retorno Outlet (o sea, lo que le mande como hijo al componente), o una redirección a /sign-in. Y ya eso sería todo.