4

无法在使用的路线中授权,@nestjs/swagger@5.0.9因为我t know how to configure the 以正确的方式使用 Document`,并且在授权官方文档/stackoverflow/github 中找不到可行的答案。

我在 swagger 中偶然发现了 JWT 授权的问题。我正在使用"@nestjs/swagger": "^5.0.9",在从公共路由获取访问令牌后,我将其插入到配置有.addBearerAuth()方法的 swagger ui 字段“授权”中,该方法在此版本(5.0.9)中具有此签名

addBearerAuth(options?: SecuritySchemeObject, name?: string)

相对于它的低版本

我已经在 Postman 中测试了我的 API,并且很容易获得授权,我还创建了一个交叉器,它在路由调用之前打印标题,但不幸的是它只在我调用公共路由时打印它们:/

我只知道 Postman 正在设置一个 Bearer 令牌并且它会抛出路由,而 swagger 并没有发生类似的事情。

我已经尝试了很多这种配置的组合,但我还没有找到一个解决方案,结果我在我的路由方法中获得了授权,从 swagger 我无法达到它,因为swagger auth 不是在配置错误或我做错事的情况下设置授权标头。我想不通。

a 的配置addBearerAuth放在较低的位置:

// swagger config
...
const config = new DocumentBuilder()
    .setTitle('SWAGGER API')
    .setVersion('1.0.0')
    .addBearerAuth(
      { 
        // I was also testing it without prefix 'Bearer ' before the JWT
        description: `[just text field] Please enter token in following format: Bearer <JWT>`,
        name: 'Authorization',
        bearerFormat: 'Bearer', // I`ve tested not to use this field, but the result was the same
        scheme: 'Bearer',
        type: 'http', // I`ve attempted type: 'apiKey' too
        in: 'Header'
      },
      'access-token',
    )
    .build();
...

我的控制器中的路线示例。与一个@ApiBearerAuth()装饰器相匹配,该装饰器大摇大摆地表示,未经授权就无法使用该方法。

@Get('/some-route')
@ApiBearerAuth()
@UseGuards(JwtAuthenticationGuard)
getData(
  @ReqUser() user: User,
): void {
  this.logger.warn({user});
}
4

1 回答 1

4

如果我理解您的问题,您需要在控制器中指定您正在使用的不记名令牌。在你的情况下:

// swagger config
...
const config = new DocumentBuilder()
    .setTitle('SWAGGER API')
    .setVersion('1.0.0')
    .addBearerAuth(
      { 
        // I was also testing it without prefix 'Bearer ' before the JWT
        description: `[just text field] Please enter token in following format: Bearer <JWT>`,
        name: 'Authorization',
        bearerFormat: 'Bearer', // I`ve tested not to use this field, but the result was the same
        scheme: 'Bearer',
        type: 'http', // I`ve attempted type: 'apiKey' too
        in: 'Header'
      },
      'access-token', // This name here is important for matching up with @ApiBearerAuth() in your controller!
    )
    .build();
...

在你的控制器中:

@Get('/some-route')
@ApiBearerAuth('access-token') //edit here
@UseGuards(JwtAuthenticationGuard)
getData(
  @ReqUser() user: User,
): void {
  this.logger.warn({user});
}
于 2021-08-17T08:10:14.757 回答