es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo implementar la función de “Recordarme” en el marco de NestJS con la estrategia de JWT

Estoy tratando de implementar la función de recordarme utilizando el marco de trabajo NestJS, ya tengo la implementación de Jwt y de la estrategia local funcionando de la siguiente manera:

import { ExtractJwt, Strategy } from 'passport-jwt';
import { PassportStrategy } from '@nestjs/passport';
import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor(private configService: ConfigService) {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      ignoreExpiration: false,
      secretOrKey: configService.get('JWT_SECRET'),
    });
  }

  async validate(payload: any) {
    return { userId: payload.sub, username: payload.email };
  }
}

Estrategia local:

import { Strategy } from 'passport-local';
import { PassportStrategy } from '@nestjs/passport';
import { Injectable, UnauthorizedException } from '@nestjs/common';
import { AuthService } from '../services/auth.service';

@Injectable()
export class LocalStrategy extends PassportStrategy(Strategy) {
  constructor(private authService: AuthService) {
    super({ usernameField: 'email' });
  }

  async validate(email: string, password: string): Promise<any> {
    const user = await this.authService.validateUser(email, password);
    if (!user) {
      throw new UnauthorizedException();
    }
    return user;
  }
}

Pensé en una manera de resolverlo a través de la bandera ignoreExpiration, ¿saben si hay una forma de implementarlo con el marco de trabajo NestJS? Intenté buscar en la documentación, pero parece que no está ahí.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para implementar la función de “recordarme” utilizando el framework NestJS, puedes modificar la clase JwtStrategy para tener en cuenta una cookie con un tiempo de expiración más largo. Aquí tienes un ejemplo:

    import { ExtractJwt, Strategy } from 'passport-jwt';
    import { PassportStrategy } from '@nestjs/passport';
    import { Injectable, Logger } from '@nestjs/common';
    import { ConfigService } from '@nestjs/config';
    import { Request } from 'express';
    
    @Injectable()
    export class JwtStrategy extends PassportStrategy(Strategy) {
       private logger = new Logger(JwtStrategy.name);
    
      constructor(private configService: ConfigService) {
        super({
          jwtFromRequest: ExtractJwt.fromExtractors([
            (request: Request) => {
              const cookie = request?.cookies?.Authentication;
              return cookie?.split(' ')[1] || null;
            },
            ExtractJwt.fromAuthHeaderAsBearerToken(),
          ]),
          // ignorar la expiración si "recordarme" es verdadero
          ignoreExpiration: (request: Request) => {
            const cookie = request?.cookies?.Authentication;
            const rememberMe = cookie?.split(' ')[0] === 'true';
            return rememberMe;
          },
          secretOrKey: configService.get('JWT_SECRET'),
        });
      }
    
      async validate(payload: any) {
        return { userId: payload.sub, username: payload.email };
      }
    }
    

    Aquí estamos utilizando el método fromExtractors de passport-jwt para verificar el token JWT en la cookie y en la cabecera de autorización. Luego, comprobamos si existe una cookie llamada Authentication y si contiene la cadena 'true' como primer valor (recordarme). Si ese es el caso, establecemos el indicador ignoreExpiration en true.

    Con este enfoque, puedes establecer un tiempo de expiración más largo para el token cuando el checkbox de “recordarme” esté marcado, y el usuario no se desconectará aunque el token haya expirado técnicamente pero la cookie siga siendo válida.

Comments are closed.