Algo a tener en cuenta es que Nico menciona varias veces que el token está “encriptado” y en realidad los JWT están codificados pero no encriptados por eso no es recomendable colocar información sensible ahí ya que cualquiera puede ver su contenido
Introducción
Cómo autenticar usuarios con NestJS
Instalación de PlatziStore con MongoDB
Instalación de PlatziStore con TypeORM
Protección con guardianes
Introducción a Guards
Usando un decorador
Guard con variables de ambiente
Autenticación con Passport
Hashing de contraseñas en TypeORM
Hashing de contraseñas en MongoDB
Autenticación con Passport.js
Ruta de login
Autenticación con JSON Web Tokens
Conectando Passport con JWT
Secret desde variables de entorno
Implementando JWT Guard
Extendiendo JWT Guard
Control de roles en NestJS
Obteniendo órdenes del perfil
Deployment
Configurando Mongo Atlas
Deploy de Mongo en Heroku
Configuración de PostgreSQL en Heroku
Deploy de Postgres en Heroku
Corriendo migraciones de Postgres en Heroku
Próximos pasos
¿Quieres más cursos de NestJS?
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
No se trata de lo que quieres comprar, sino de quién quieres ser. Aprovecha el precio especial.
Antes: $249
Paga en 4 cuotas sin intereses
Termina en:
Nicolas Molina
Aportes 9
Preguntas 0
Algo a tener en cuenta es que Nico menciona varias veces que el token está “encriptado” y en realidad los JWT están codificados pero no encriptados por eso no es recomendable colocar información sensible ahí ya que cualquiera puede ver su contenido
npm install --save @nestjs/jwt passport-jwt
npm install --save-dev @types/passport-jwt
Para MongoDB viene desde la base de datos misma _id por tanto para que obtengamos el sub correctamente debemos colocarlo tal como viene de la base de datos.
generateJWT(user: User) {
const payload: PayloadToken = { role: user.role, sub: user._id };
return {
access_token: this.jwtService.sign(payload),
user,
};
}
Para verificar los JWT token generados, pueden utilizar esta herramienta: https://jwt.io
Los JWT nos permiten tener una verificación de que un usuario se a loggeado en la aplicación de manera satisfactoria, validando en nuestra base de datos y si el usuario es correcto, este token actúa como sesión que permite entrar a los Endpoints que deseamos, y con este token le damos permisos al usuario para hacer request.
Los JWT también sirven en aplicaciones móviles.
Nest.js también tiene un paquete para manejar los JWT, veamos que dependencias debemos instalar para manejar JWT con Nest y Passport:
# dependencias
npm install --save @nestjs/jwt passport-jwt
# tipos para desarrollo
npm install --save-dev @types/passport-jwt
Una vez hecho esto, vamos a ir a nuestro servicio de autenticación para pedirle que cuando un usuario haga loggin, genere un JWT.
**src/auth/service/auth.service.ts**
:@Injectable()
export class AuthService {
async generateJwt(user: User) {
const payload = {
role: user.role,
sub: user.id,
};
// ...
}
}
Bien, ahora, como buena práctica deberíamos crear un modelo del payload que estamos retornando, esto en caso de que necesitemos reutilizarlo en nuestra aplicación:
**src/auth/models/token.model.ts**
:// exportamos una interfaz que sea lo que esperamos de el token
export interface PayloadToken {
role: string;
sub: string;
}
Y luego, lo que nos quedaría sería importar el modelo utilizarlo:
**src/auth/service/auth.service.ts**
:import { PayloadToken } from '../models/token.model';
@Injectable()
export class AuthService {
async generateJwt(user: User) {
const payload: PayloadToken = {
role: user.role,
sub: user.id,
};
// ...
}
}
Y listo, de esta forma ya tenemos la configuración inicial para crear los JWT.
Para quitar __v y reemplazar _id por id
@Schema()
class User extends Document {
@Prop({ required: true, unique: true })
email: string;
@Prop({ required: true })
password: string;
@Prop({ required: true })
role: string;
}
const UserSchema = SchemaFactory.createForClass(User);
UserSchema.method('toJSON', function () {
const { __v, _id, password, ...object } = this.toObject();
object.id = _id;
return object;
});
export { User, UserSchema };
Si antes de pasar a la siguiente clase tienen un error es por que en la siguiente clase lo resuelven.
No olviden cambiar el Http code: 200 OK
auth.controller.ts
import { Controller, Post, Req, UseGuards, HttpCode } from '@nestjs/common';
import { Request } from 'express';
import { AuthGuard } from '@nestjs/passport';
@Controller('/auth')
export class AuthController {
@UseGuards(AuthGuard('local'))
@Post('/login')
@HttpCode(200)
login(@Req() req: Request) {
return req.user;
}
}
👏
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?