Franklin Gil
me da anciedad cuando el profe hace los imports manualmente xD
Randy Benjamin Castro
x2
Alexis Franco
Por qué anciendad? Podrías explicarme?
El uso principal para los Interceptores es para la inyección del token en las request.
Inyección de token
Veamos cómo puedes utilizar los interceptores para la inyección de token a las solicitudes HTTP.
1. Crea el interceptor
Para esto, crea un nuevo interceptor que lea el token desde el storage donde decidiste guardarlo y posteriormente inyectarlo en las peticiones.
// interceptors/token-interceptor.interceptor.ts @Injectable() export class TokenInterceptorService implements HttpInterceptor { intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<unknown>> { request = this.addHeaders(request); return next.handle(request) } private addHeaders(request: HttpRequest<any>) { let token: string | null = ''; token = localStorage.getItem('platzi_token'); if (token) { return request.clone({ setHeaders: { Authorization: `Bearer ${token}` } }); } else { return request; } } }
2. Duplicando la solicitud
La función addHeaders() recibe la request y usando clone() crea una copia de si misma para inyectar el token. De no existir este, devuelve la request tal cual fue recibida.
De esta manera, limpias por completo tu servicio que se ocupa de la autenticación de usuarios y centralizas toda la lógica de inyección de headers en el interceptor.
Y no olvides de importar el nuevo interceptor en tu módulo.
// app.module.ts import { ErrorsInterceptor } from './interceptors/errors.interceptor'; import { TokenInterceptorService } from './interceptors/token-interceptor.interceptor'; @NgModule({ providers: [ { provide: HTTP_INTERCEPTORS, useClass: ErrorsInterceptor, multi: true }, { provide: HTTP_INTERCEPTORS, useClass: TokenInterceptorService, multi: true } ] }) export class AppModule { }
Agrégalo a los providers y si ya tienes otro interceptor, también agrega la propiedad multi: true a cada uno de ellos.
Contribución creada por: Kevin Fiorentino.
Franklin Gil
me da anciedad cuando el profe hace los imports manualmente xD
Randy Benjamin Castro
x2
Alexis Franco
Por qué anciendad? Podrías explicarme?
<code> if(user){ request = request.clone({ setHeaders:{ Authorization: `Bearer ${user.token}` } }); } return next.handle(request);
Yerson Alexander Arredondo García
Me parece que el código queda mucho más legible así:
private addToken(request: HttpRequest<unknown>) { const token = this.tokenService.get(); if (!token) { return request; } const authResquest = request.clone({ headers: request.headers.set('Authorization', `Bearer ${token}`) }); return authResquest; }
luisa fernanda castillo saavedra
Estoy implementando el interceptor para el Token pero al inpeccionar el codigo en red no me muestra la informacion de Authorization, me podrias indicar si es normal o porque sucede esto?
Daniel Meza
Muestra tu código.
¿sí lo declaraste en los providers de tu app.module.ts?
Ej.
providers: [ { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptorService, multi: true, }, ],
Julian Franco
Daniel Pacheco
Disculpa, en el getToken, no se deberia hacer un .get a "platzi_token"?
Julian Franco
Correcion funcion saveToken
saveToken (token: string){ this.cookieService.deleteAll('/'); this.cookieService.set("token", token) }
Alfredo Luis Racero Blanco
¿Es posible usar cookies para el token?
Sí, y de hecho es una práctica altamente recomendada por motivos de seguridad. Mientras que localStorage es vulnerable a ataques XSS (Cross-Site Scripting) porque cualquier script de JavaScript en el navegador puede leer su contenido, las cookies pueden configurarse con la bandera HttpOnly. Cuando una cookie es HttpOnly, el navegador prohíbe estrictamente que JavaScript acceda a ella, mitigando el riesgo de robo de tokens. Además, si configuras la cookie con los atributos Secure (solo viaja por HTTPS) y SameSite (previene ataques CSRF), elevas drásticamente la seguridad de tu aplicación. Para implementarlo en Angular, el backend debe enviar el token directamente en un encabezado Set-Cookie durante el login, y el navegador se encargará de adjuntarlo automáticamente en las siguientes peticiones.
Diego Fernando Caviedes Camaho
el HttpRequest<unknown> es una referencia genérica?
Daniel Meza
Sí. es un tipo de respuesta. Que dentro, contiene algo que tu API te ha devuelto, ya sea la data que solicitaste. Por lo que, puedes tiparlo con el tipo de dato que esperas del API.
Unknown es un tipo de dato que recomiendo usar en lugar de any
Dejo acá un poco de info al respecto: Deja de usar el tipo de dato Any en Typescript
Jhon Azcarate
Gente , los que ya hicieron el curso de angular 17 , no estaría chido probar hacer lo del token con un computed o un signal ?.
James Diaz Lopez
The username: sebas@mail.com "NOT FOUND" 🫠
Rodrigo Bejar
tengo el mismo error con el token :O
Sergio Negrete Villegas
storage token
Maria Catalina Coy Calixto
almacenar tokens en cookies no es inseguro?
Santiago Bernal
Santiago Bernal
ya lo solucioné por si a alguien le pasa lo mismo.
login(email: string, password: string){ return this.http.post<IAuth>(`${this.urlAPI}/login`,{email, password} ) .pipe( tap(response => { this.tokenService.saveToken(response.access_token) }) ) .subscribe(); }
Gersom Hernandez
Super!!
Gustavo Jiménez Liévano
Muy buena clase. Gracias
Una opcion para manejar con Cookies seria la siguiente:
Instalamos una dependencia extra.
npm install ngx-cookie-service --save
Y agregamos esto a nuestros servicios, recordemos que podemos configurarla, traerla y tambien eliminarla.
import { Injectable } from '@angular/core'; import { CookieService } from 'ngx-cookie-service'; @Injectable({ providedIn: 'root' }) export class TokenService { constructor( private cookieService: CookieService ) { } saveToken (token: string){ this.cookieService.deleteAll('/'); this.cookieService.set("platzi_token", token) } getToken(){ return this.cookieService.get("token") } removeToken() { this.cookieService.deleteAll('/') this.cookieService.delete("token", '/'); } }
al hacer
login(email: string, password: string){ return this.http.post<IAuth>(`${this.urlAPI}/login`,{email, password} ) .pipe( tap( response => this.tokenService.saveToken(response.access_token)) ); }
no se comunica con el metodo save token
saveToken(token: string){ console.log(token) localStorage.setItem('token', token); }
pero si lo hago por subscribe si, alguien sabe por que?