Controla el acceso y la visibilidad de tu interfaz en Angular con total claridad. Aquí verás cómo usar AngularFireAuth, authState, ngIf y un guardia canActivate para mostrar u ocultar elementos según el estado de sesión, y cómo impedir el acceso por URL a vistas restringidas. Además, se explica el rol del JSON Web Token en local storage y el ajuste de reglas de lectura y escritura.
¿Cómo controlar la UI con ngIf y authState?
Para decidir qué ve un usuario según si está logueado, se aprovecha authState de AngularFireAuth. Este stream existe solo cuando hay sesión activa y expone un identificador único (UID).
Idea clave: authState indica si hay usuario autenticado.
Variable de estado: loggedIn = false para controlar la vista.
Visibilidad condicional: usar ngIf para mostrar u ocultar login y registro.
¿Qué hace la función isLogged?
Función pública: isLogged devuelve el stream de autenticación.
Origen de datos: usa el objeto de autorización y su authState.
Inicio temprano: se invoca desde el constructor para escuchar desde que abre la app.
Prueba final: sin sesión, no permite navegar ni con la URL directa; con sesión, el acceso se concede normalmente.
Palabras clave y habilidades trabajadas: JSON Web Token en local storage, authState y stream de autenticación, control visual con ngIf, manejo de errores en subscribe, reglas de lectura y escritura en base de datos, uso de guardia canActivate, configuración en providers y rutas, y navegación protegida por URL y path.
¿Te gustaría que profundicemos en el flujo de logout o en estrategias de redirección tras el login? Comparte tus dudas y casos de uso en los comentarios.
Los **Guard **son un tema muy extenso, hay varios tipos de Guard [canActivate, canActivateChildren, canDeactivate, Resolve, canLoad]:
En este caso implementamos un guarde tipo canActivate que normalmente retorna un true o false para indicar que el usuario tiene acceso a la ruta.
Que deberíamos usar para controlar perfiles? Por ejemplo mostrar algunas opciones a ciertos perfile?
Deberian actualizar el curso cada vez es mas dificil porder seguir el curso, y se pierde tiempo tratando de adaptar cosas que ahora ya no funcionan
Este curso se saco apenas salio la versión de Angular 4, infortunadamente el ciclo de actualizaciones de angular es muy corto y es bastante difícil seguir el paso ya que sacan versiones cada 6 meses, hay un par de clases que muestran los cambios entre versiones y como implementarlos.
Totalmente de acuerdo,. muy desactualizado
Hola a todos. Encontré la solución al problema del las peticiones HTTP con token. Muchos por aquí ya dieron su solución. Pero a mí no me sirvió ninguna de ellas. Os dejo mí código por aquí:
constructor(privatelugaresService:LugaresService,privatefireAuth:AngularFireAuth){this.fireAuth.auth.onAuthStateChanged(user=>{if(user){this.fireAuth.auth.currentUser.getIdToken(true).then((idToken)=>{this.lugaresService.getLugares(idToken).subscribe(lugares=>{this.lugares=Object.keys(lugares).map(key=>{ lugares[key].id= key;return lugares[key];});this.state='final';},error=>{this.errorMessage=`Tenemos algo de dificultados, disculpe las molestias. Error: ${error.status}`;});});}});}
this.fireAuth.auth.onAuthStateChanged Es un escuchador de eventos que saltará cuando firebase haya devuelto el usuario logeado. Con eso podrás hacer F5 y no dará error.
this.fireAuth.auth.currentUser.getIdToken Con esta línea pides el token de autenticación del usuario logeado.
this.lugaresService.getLugares Y por último llamamos a nuestro servicio de lugares pasándole el token como parámetro.
Espero que os sirva, un saludo!
una pregunta, como declaras la variable idToken en el servicio?
no me funciono
Al momento de modificar las reglas y dejar el valor del atributo _write _como ‘auth !== null’ provoca que ya no se puedan registrar usuarios nuevos.
¿Alguien sabe de que forma podemos manejar esto y poder permitir la escritura solo en el caso del registro? ¿O consideran que lo mejor en este caso sería manejarlo con el guardia y habilitar la escritura para todos?
Uso Angular 7 y aun así el código del video funciona bien.
import{AutorizacionService}from'./autorizacion.service';import{Injectable}from'@angular/core';import{CanActivate}from'@angular/router';@Injectable({providedIn:'root'})exportclassMyGuardServiceimplementsCanActivate{ loggedIn =false;constructor(privateautorizacionService:AutorizacionService){this.autorizacionService.isLogged().subscribe(result=>{if( result && result.uid){this.loggedIn=true;}else{this.loggedIn=false;}},error=>{this.loggedIn=false;});}canActivate(){returnthis.loggedIn;}}
Hola profe, una pregunta, que es lo que hace el método subscribe?
Te recomiendo escribir al correo de TeamPlazi y dile que tu duda no a sido respondida, yo ya me queje y aun no me han dado solución
Buena forma de seguridad de rutas
Protegeré mis rutas de una manera confiable. Muy buena clase.
¿Qué pasa si tengo un usuario en firebase de email con identificador 'minombre@empresa.com' y cuando uso el login con facebook el identificador también es 'minombre@empresa.com' ? Firebase me manda error.
ERRORin./src/app/services/my-guard.service.tsModule parse failed:The keyword 'private' is reserved(25:16)You may need an appropriate loader to handle this file type.|{| loggedIn =false;|constructor(private, authservice, autorizaciones_service_1.AutorizacionesService);|{|this.authservice.isLogged() @ ./src/app/app.module.ts34:25-63 @ ./src/main.ts @ multi webpack-dev-server/client?http://0.0.0.0:0./src/main.ts
La ruta del import la tienes mal es ./autorization.service en lugar de ./services/autorization.service ya que my-guard.service y autorizacion.service estan en la misma carpeta.
Muchas gracias.
Wow, increíbles usos y analogías
No entiendo muy bien por que se llama a isLogged en el costructor de autorizacionService, cuál es su utilidad?
Para que cuando se cree la instancia de AutorizacionService o se cargue este servicio de inmediato llame a la función isLogged y desde ese momento poder verificar si el usuario se encuentra o no logueado.
Necesito ayuda con el siguiente error:
compiler.es5.js:1690UncaughtError:Can't resolve all parameters forMyGuard:(?).
No lo entiendo :S
Pude resolver, resulta que solamente es que en el servicio de mi guardia había olvidado el @ antes de Injectable jajajaja.