Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

400
Vistas
Angular Social Login (con Google) + Angular Guards

Estoy tratando de implementar un Angular Guard usando el paquete npm de Angular Social Login:

 @Injectable({ providedIn: 'root', }) export class LoginGuard implements CanActivate { constructor(private router: Router, private authService: SocialAuthService) {} canActivate( route: ActivatedRouteSnapshot, state: RouterStateSnapshot ): Observable<boolean> { console.log('guard'); return this.authService.authState.pipe( map((socialUser: SocialUser) => { console.log('map'); return !!socialUser; }), catchError((error) => { console.log(error); return of(false); }) ); } }

Puedo ver que la guard se imprime en la consola. Sin embargo, no puedo ver el map impreso en la consola. ¿Por qué?

Si lo hago:

 @Injectable({ providedIn: 'root', }) export class LoginGuard implements CanActivate { constructor(private router: Router, private authService: SocialAuthService) {} canActivate( route: ActivatedRouteSnapshot, state: RouterStateSnapshot ): Observable<boolean> { console.log('guard'); return new Observable<boolean>((subscriber) => { console.log('subscriber'); subscriber.next(true); }); } }

Puedo ver el subscriber que se imprime en la consola.

¿Qué estoy haciendo mal?

Quiero poder agregar este Guardia a una ruta. Si un usuario no ha iniciado sesión, sería redirigido a una página de inicio de sesión (sé que todavía no estoy implementando esa lógica; lo intenté y fallé porque parece que no obtengo un Observable con valores). Tenga en cuenta que estoy usando Google como proveedor para esto:

 @NgModule({ declarations: [ AppComponent, IndexPageComponent, SearchPageComponent, InputKeywordsComponent, DisplayNewsListComponent, ], imports: [ BrowserModule, AppRoutingModule, ReactiveFormsModule, HttpClientModule, SocialLoginModule, ], providers: [ { provide: 'SocialAuthServiceConfig', useValue: { autoLogin: false, providers: [ { id: GoogleLoginProvider.PROVIDER_ID, provider: new GoogleLoginProvider( 'superVerySecret' ), }, ], } as SocialAuthServiceConfig, }, ], bootstrap: [AppComponent], }) export class AppModule {}

Y el módulo de enrutamiento:

 const routes: Routes = [ { path: '', component: IndexPageComponent }, { path: 'search', component: SearchPageComponent, canActivate: [LoginGuard] }, ]; @NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule], providers: [LoginGuard] }) export class AppRoutingModule {}

PS1: Puedo iniciar sesión muy bien.

PS2:

  • @angular/núcleo@12.2.13
  • @rxjs@6.6.7
  • angularx-social-login@4.0.1
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Necesita una take(1) antes de su mapa, para obtener el valor más reciente de this.authService.authState es decir:

 @Injectable({ providedIn: 'root', }) export class LoginGuard implements CanActivate { constructor(private router: Router, private authService: SocialAuthService) {} canActivate( route: ActivatedRouteSnapshot, state: RouterStateSnapshot ): Observable<boolean> { console.log('guard'); return this.authService.authState.pipe( take(1), // <--- add this line map((socialUser: SocialUser) => { console.log('map'); return !!socialUser; }), catchError((error) => { console.log(error); return of(false); }) ); } }
over 4 years ago · Santiago Trujillo Denunciar

0

Felicitaciones a @msmiechowski por ayudarme a encontrar una solución en este problema de GitHub.

Mi solución:

 // login.guard.ts @Injectable({ providedIn: 'root', }) export class LoginGuard implements CanActivate { constructor(private router: Router, private loginService: LoginService) {} canActivate( route: ActivatedRouteSnapshot, state: RouterStateSnapshot ): Observable<boolean> { if (this.loginService.checkAuthState()) { return of(true); } else { this.router.navigateByUrl('/'); return of(false); } } }
 // login.service.ts // ... checkAuthState(): boolean { let flag = false; this.authService.authState.subscribe({ next: (socialUser: SocialUser) => { if (socialUser) { flag = true; } }, error: (error) => { console.log(error); }, complete: () => { console.log('Complete!'); }, }); return flag; } // ...
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda