Angular: Autenticación y autorización

Aprende cómo implementar autenticación y autorización en Angular 18 siguiendo las mejores prácticas y recomendaciones de la documentación oficial.

En Angular 18, la autenticación y la autorización son fundamentales para crear aplicaciones seguras. Este módulo se centra en cómo implementar estas funcionalidades siguiendo las mejores prácticas y recomendaciones actuales.

Configuración inicial

Para empezar, asegúrate de tener configurado un nuevo proyecto de Angular 18. Si aún no lo has hecho, ejecuta el siguiente comando:

ng new mi-proyecto-angular
cd mi-proyecto-angular

Instalación de dependencias

Para manejar la autenticación y autorización, es recomendable usar bibliotecas como @auth0/angular-jwt. Instálala con:

npm install @auth0/angular-jwt

Configuración del módulo HTTP

Configura el módulo HTTP y los interceptores para manejar los tokens JWT.

import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
import { JwtModule } from '@auth0/angular-jwt';

export function tokenGetter() {
  return localStorage.getItem('access_token');
}

@NgModule({
  imports: [
    HttpClientModule,
    JwtModule.forRoot({
      config: {
        tokenGetter: tokenGetter,
        allowedDomains: ['localhost:4200'],
        disallowedRoutes: ['localhost:4200/api/auth']
      }
    })
  ],
  providers: [
    { provide: HTTP_INTERCEPTORS, useClass: JwtInterceptor, multi: true }
  ]
})
export class AppModule {}

Servicio de autenticación

Crea un servicio de autenticación para manejar el inicio de sesión y la gestión de tokens.

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Router } from '@angular/router';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';

@Injectable({
  providedIn: 'root'
})
export class AuthService {
  private apiUrl = 'http://localhost:4200/api/auth';

  constructor(private http: HttpClient, private router: Router) {}

  login(credentials: { email: string, password: string }): Observable<any> {
    return this.http.post(`${this.apiUrl}/login`, credentials).pipe(
      tap((response: any) => {
        localStorage.setItem('access_token', response.token);
      })
    );
  }

  logout() {
    localStorage.removeItem('access_token');
    this.router.navigate(['login']);
  }

  public get loggedIn(): boolean {
    return localStorage.getItem('access_token') !== null;
  }
}

Guardias de ruta

Implementa guardias de ruta para proteger las rutas que requieren autenticación.

import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router } from '@angular/router';
import { AuthService } from './auth.service';

@Injectable({
  providedIn: 'root'
})
export class AuthGuard implements CanActivate {

  constructor(private authService: AuthService, private router: Router) {}

  canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): boolean {
    if (this.authService.loggedIn) {
      return true;
    } else {
      this.router.navigate(['login']);
      return false;
    }
  }
}

Uso de guardias en rutas

Configura las rutas protegidas en tu módulo de enrutamiento.

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { AuthGuard } from './auth.guard';
import { LoginComponent } from './login/login.component';
import { DashboardComponent } from './dashboard/dashboard.component';

const routes: Routes = [
  { path: 'login', component: LoginComponent },
  { path: 'dashboard', component: DashboardComponent, canActivate: [AuthGuard] },
  { path: '**', redirectTo: 'login' }
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule {}
Certifícate en Angular con CertiDevs PLUS

Lecciones de este módulo de Angular

Lecciones de programación del módulo Autenticación y autorización del curso de Angular.

Ejercicios de programación en este módulo de Angular

Evalúa tus conocimientos en Autenticación y autorización con ejercicios de programación Autenticación y autorización de tipo Test, Puzzle, Código y Proyecto con VSCode.