NestJS中Swagger UI配置后未自动携带Authorization头问题
问题分析
你的问题核心在于Swagger安全方案的名称不匹配:
- 你在
DocumentBuilder.addBearerAuth()中指定了安全方案名称为'access-token'(第二个参数) - 但控制器上的
@ApiBearerAuth()装饰器没有传入对应名称,默认会使用'default'作为安全方案名
这就导致Swagger UI无法关联你配置的Bearer认证规则,授权后不会自动携带Token。
解决方案
以下两种修改方式二选一即可:
方式1:让@ApiBearerAuth()匹配安全方案名称
修改questions.controller.ts中的@ApiBearerAuth(),传入你定义的安全方案名'access-token':
@Controller('questions') @ApiBearerAuth('access-token') // 这里添加匹配的名称 @UseGuards(AuthGuard('jwt')) @UsePipes(new BlockSymbolsPipe()) export class QuestionsController { // ... 其余代码不变 }
方式2:统一使用默认安全方案名称
修改main.ts中的addBearerAuth(),去掉第二个参数(默认使用'default'作为方案名):
.addBearerAuth( { type: 'http', scheme: 'bearer', bearerFormat: 'JWT', description: 'Input your JWT token', name: 'Authorization', in: 'header', } // 移除第二个参数 'access-token' )
同时保持@ApiBearerAuth()无参数即可,无需修改控制器代码。
额外验证点
- 确认Swagger UI的全局安全配置和方案名称一致:
你的swaggerOptions.security已经配置为[{ 'access-token': [] }],如果用方式1,这个配置不用改;如果用方式2,需要改成[{ 'default': [] }]。 - 清除浏览器缓存后重新打开Swagger UI页面,避免旧配置残留。
修改完成后,重新启动应用,点击Swagger UI右上角的「Authorize」输入Token,再调用接口就会自动携带Authorization: Bearer <token>请求头了。
内容的提问来源于stack exchange,提问作者r00k13
相关产品推荐
相关产品推荐

