在 NestJS 中,我可以在控制器级别添加啥装饰器以向我的 Swagger 文档添加授权标头?

Posted

技术标签:

【中文标题】在 NestJS 中,我可以在控制器级别添加啥装饰器以向我的 Swagger 文档添加授权标头?【英文标题】:In NestJS, what is the decorator I can add at a controller level to add an Authorization header to my Swagger docs?在 NestJS 中,我可以在控制器级别添加什么装饰器以向我的 Swagger 文档添加授权标头? 【发布时间】:2021-08-29 08:06:57 【问题描述】:

我正在使用 NestJS 7.6.11。我的控制器上有以下装饰器...

@Controller('private')
@ApiTags('MyObjects')
@ApiConsumes('application/json')
@ApiProduces('application/json')
@UseInterceptors(new JwtInterceptor())
export class MyController 

我是否可以添加任何装饰器来生成 Swagger (OpenAPI 3) 文档,从而表明我的控制器中的所有方法都需要具有“授权”标头?

编辑:作为回应,我添加了@ApiHeader,所以我的控制器和方法看起来像

@

Controller('myendpoint')
@ApiTags('MyObject')
@ApiConsumes('application/json')
@ApiProduces('application/json')
@ApiHeader(
  name: 'authorization',
  description: 'Auth token',
)
@UseInterceptors(new JwtInterceptor())
export class MyObjectController 

...
 @Get('/:id')
  @ApiOkResponse(
    description: 'OK',
    type: Content,
  )
  @ApiBadRequestResponse()
  @ApiInternalServerErrorResponse()
  @ApiOperation(
    summary: 'Get object by id',
    description: 'Get object by id',
    operationId: 'findObjectById',
  ) 
  findObjectById(@Req() req, @Param('id') id: string): Promise<MyObject> 

但是当生成 swagger 文档时,虽然我可以输入“授权”标头值,

当我单击“执行”时,它不会包含在我的 curl 中,它生成为

curl -X GET "http://localhost:8060/myendpoint/abcdef" -H  "accept: application/json"

【问题讨论】:

【参考方案1】:

@ApiHeader()@ApiBasicAuth()@ApiBearerAuth()@ApiOAuth2()@ApiSecurity(),所有这些都可以在this page上找到。您的具体情况可能会有所不同,但其中一种应该可以解决问题。

【讨论】:

我尝试了 ApiHeader,因为我希望将其应用于我的控制器中的所有方法,但 Swagger 在从 Swagger UI 发送请求时没有添加该标头。我认为这可能与此有关——github.com/nestjs/swagger/issues/486。还有其他方法吗? 看起来该问题已在 @nestjs/swagger@4.1.1 中修复。 嗯,我使用的是 4.7.12 版本。我应该恢复到旧版本吗? 不,在控制器上使用@ApiHeader() 应该还是可以的。 在 OpenAPI 3 中,Authorization 标头必须定义为 安全方案,因此 @ApiHeader() 将不起作用 - Swagger UI 将 ignore 标头参数命名为 @987654334 @(根据规范)。如果您的身份验证令牌具有“Bearer”前缀,请使用ApiBearerAuth()。否则请尝试使用@ApiSecurity + DocumentBuilder().addApiKey(...),如下例所示:github.com/nestjs/swagger/issues/484

以上是关于在 NestJS 中,我可以在控制器级别添加啥装饰器以向我的 Swagger 文档添加授权标头?的主要内容,如果未能解决你的问题,请参考以下文章

NestJS Swagger:在 ApiProperty 装饰器中描述地图

如何使用来自@nestjs/mongoose 的@Prop 装饰器添加嵌套的对象数组

nestjs 中的可选身份验证

NestJS:如何使用另一个装饰器自动记录@MessagePattern 的输入数据?

所有控制器的全局标头(nestJs swagger)

如何在 swagger nestjs 中手动添加摘要和正文