Nest js - token приходит undefined

Мне нужна ваша помощь

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.use(cookieParser());
  app.enableCors({
    origin: process.env.FRONTEND_URL || 'http://localhost:3000',
    credentials: true,
  });
  app.setGlobalPrefix('api');
  app.useGlobalPipes(
    new ValidationPipe({ whitelist: true, forbidNonWhitelisted: true }),
  );
  await app.listen(process.env.PORT || 5000);
}
bootstrap();


@Controller('projects')
export class ProjectsController {
  constructor(private readonly projectsService: ProjectsService) {}

@UseGuards(VerifyTokenGuard, VerifyRoleGuard)
  @Get()
  async findAll() {
    try {
      const projects = await this.projectsService.findAll();

      return {
        success: true,
        message: 'Projects returned from database',
        data: projects,
      };
    } catch (error) {
      throw error;
    }
  }
}

@Injectable()
export class VerifyTokenGuard implements CanActivate {
  constructor(
    private readonly jwtService: JwtService,
    private readonly prisma: PrismaService,
  ) {}

  async canActivate(context: ExecutionContext): Promise<boolean> {
    const request = context.switchToHttp().getRequest();

    const token = request.cookies['access_token'];

    console.log('TOKEN: ' + token);

    if (!token) {
      throw new ForbiddenException('Unauthorized access');
    }

    try {
      const payload = this.jwtService.verify(token);

      const user = await this.prisma.users.findUnique({
        where: {
          email: payload.email,
        },
      });

      if (!user) {
        throw new NotFoundException(
          "There is doesn't have user with this email.",
        );
      }

      request.user = user;

      return true;
    } catch (error) {
      throw error;
    }
  }
}

токен приходит undefined, но в postman все работает. Отправляю запрос из Frontend с помощью axios withCredentials: true, файл cookie существует в браузере, но серверная часть не может его найти.

добавил middleware в front там все в порядке с куками. В backend декоратор @Req() request: Request из express тоже не смог найти куки

export const search = async (): Promise<{
    success: boolean
    message: string
    data: ProjectType[]
}> => {
    return (
        await axiosInstance.get(apiRoutes.ALL_PROJECTS, {
            withCredentials: true,
        })
    ).data
}

это из front axios запрос. Проверил с postman там все работает отлично

Оставлю скрины

projectsController projectsService axiosInstance запрос


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

Автор решения: Roman C

Можно получить токен следующим образом

  async canActivate(context: ExecutionContext): Promise<boolean> {
    const request = context.switchToHttp().getRequest();
    const token = this.getToken(request);
    if (!token) {
      throw new UnauthorizedException();
    }    
    return true;
  }

  private getToken(request: Request): string | undefined {
    const [type, token] = request.headers.authorization?.split(' ') ?? [];
    return type === 'Bearer' ? token : undefined;
  }
→ Ссылка
Автор решения: Василий Волгин

Возможно, проблема с CORS или передачей cookies. Предлагаю для начала поправить так:

app.use(cookieParser());
app.enableCors({
  origin: process.env.FRONTEND_URL || 'http://localhost:3000',
  credentials: true,
});

Далее нужно убедиться, что withCredentials: true и дальше логировать проблему.

→ Ссылка