Выход из сессии

Собственно, вопрос вот в чем: «Как организовать выход из приложения на стороне сервера?» Раньше я делал это следующим образом: я генерировал JWT-токен на сервере и передавал его на клиент, где он хранился в localStorage. Если пользователь выходил из приложения, токен удалялся из localStorage, и заголовок приходил пустым на сервер. Это означало, что сессия закончена.

Сейчас мне нужно реализовать функцию выхода из приложения на стороне сервера. Интернет предлагает использовать Redis, чтобы сохранять токен в черном списке, или куки, но я не могу разобраться, как это сделать. Ниже я покажу свой код для генерации токена и то, как я его обрабатываю.

Мои предположения такие: при регистрации или логине генерировать токен и куки, и где-то их хранить. Если на клиенте куки пустые, то пользователь считается вышедшим из приложения. При обработке маршрута 'logout' я должен удалять/очищать куки. Извините за, возможно, глупый вопрос. Как вы видите реализацию функции выхода из приложения на стороне сервера?

@Injectable()
export class JwtAuthGuard implements CanActivate {
  constructor(private jwtService: JwtService) {}

  canActivate(
    context: ExecutionContext,
  ): boolean | Promise<boolean> | Observable<boolean> {
    const req = context.switchToHttp().getRequest();

    try {
      const authHeader = req.headers.authorization;

      if (!authHeader) {
        return false;
      }

      const [bearer, token] = authHeader.split(' ');

      if (bearer !== 'Bearer' || !token) {
        throw new UnauthorizedException({
          message: 'Пользователь не авторизован.',
        });
      }

      const user = this.jwtService.verify(token);

      req.user = user;

      return true;
    } catch (e) {
      console.log(e);
      throw new UnauthorizedException({
        message: 'Пользователь не авторизован.',
      });
    }
  }
}

Ниже будет сервис регистрации.Хотелось бы услышать как мне стоит изменить мой код, исходя из задания.

   public async registration(userDto: CreateUserDto) {
    const candidate = await this.userService.getUserByEmail(userDto.email);

    if (candidate) {
      throw new DuplicateException(
        'Пользователь с таким email уже существует.',
      );
    }
    const hashPassword = await bcrypt.hash(userDto.password, 3);

    const user = await this.userService.createUser({
      ...userDto,
      password: hashPassword,
    });

    return this.generateToken(user);
  }

Ответы (0 шт):