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 там все работает отлично
Оставлю скрины
Ответы (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
и дальше логировать проблему.