我在 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 页面右上角的“授权”按钮登录后,我看不到任何包含或不包含单个请求的令牌的选项。它应该自动发送令牌与所有需要授权的请求,但在我的例子中它没有这样做。
您是否尝试过将令牌粘贴到 swagger 中而不使用
Bearer
。
如果 Swagger 设置正确,则不需要在输入框中写入
Bearer
。 Swagger 会自动将其添加到标题中。