尽管在 NestJS 中进行了配置,Swagger UI 仍不发送授权标头

问题描述 投票:0回答:1

我在 NestJS 应用程序中遇到 Swagger UI 问题,它没有随请求发送授权标头。我已经设置了 JWT 身份验证,当我通过手动包含授权标头使用 cURL 或 Postman 测试端点时,一切正常。但是,当我通过 Swagger UI 页面右上角的“授权”按钮登录后使用 Swagger UI 时,请求中不包含 Authorization 标头,导致服务器返回 401 Unauthorized 响应。

以下是我在 main.ts 文件中配置 Swagger 的方法:

// src/main.ts

import { NestFactory } from '@nestjs/core';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  const config = new DocumentBuilder()
    .setTitle('My Project API')
    .setDescription('API description for My Project')
    .setVersion('1.0')
    .addTag('myproject')
    .addBearerAuth(
      {
        type: 'http',
        scheme: 'bearer',
        bearerFormat: 'JWT',
        description: 'Input your JWT token',
        name: 'Authorization',
        in: 'header',
      },
      'access-token',
    )
    .build();
  const document = SwaggerModule.createDocument(app, config);
  SwaggerModule.setup('api', app, document, {
    swaggerOptions: {
      security: [{ 'access-token': [] }],
    },
  });
  await app.listen(3000);
}
bootstrap();

这是我的 questions.controller.ts 文件:

// src/questions/questions.controller.ts

import {
  Controller,
  Post,
  Body,
  UseGuards,
  ValidationPipe,
  UsePipes,
} from '@nestjs/common';
import { QuestionsService } from './questions.service';
import { CreateQuestionDto } from './dto/create-question.dto';
import { QuestionEntity } from './question.entity';
import { AuthGuard } from '@nestjs/passport';
import { BlockSymbolsPipe } from 'src/pipes/block-symbols.pipe';
import { ApiBearerAuth } from '@nestjs/swagger';

@Controller('questions')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'))
@UsePipes(new BlockSymbolsPipe())
export class QuestionsController {
  constructor(private questionsService: QuestionsService) {}

  @Post()
  createQuestion(
    @Body(ValidationPipe) createQuestionDto: CreateQuestionDto,
  ): Promise<QuestionEntity> {
    return this.questionsService.createQuestion(createQuestionDto);
  }
}

我目前在 Ubuntu 中使用 NestJS 版本 10、“@nestjs/swagger”版本“^7.1.12”和“swagger-ui-express”版本“^5.0.0”。

在 Postman 中,我必须手动在每个请求中包含令牌。然而,在 Swagger UI 中,它似乎是一个全局设置。使用 Swagger UI 页面右上角的“授权”按钮登录后,我看不到任何包含或不包含单个请求的令牌的选项。它应该自动发送令牌与所有需要授权的请求,但在我的例子中它没有这样做。

nestjs swagger-ui nestjs-config nestjs-swagger
1个回答
0
投票

您是否尝试过将令牌粘贴到 swagger 中而不使用

Bearer

如果 Swagger 设置正确,则不需要在输入框中写入

Bearer
。 Swagger 会自动将其添加到标题中。

© www.soinside.com 2019 - 2024. All rights reserved.