Java, 原创,

在swagger请求数据的时候带上header头部信息Authorization解决方法

使用 Swagger注解添加Authorization字段无效的情况,先来看个例子

@Slf4j
@RestController
@RequiredArgsConstructor(onConstructor_ = {@Autowired})
@Tag(name = "数据交互接口", description = "运行,统计数据等接口 - 开发者:(chenxue)")
@RequestMapping("/api/v1")
public class ElevatorPushController {
    private final ElevatorPushService elevatorPushService;

    @Operation(summary = "获取实时运行数据")
    @PostMapping("/media/getRealtimeData")
    public SingleResponse<RunningDTO> getRealtimeData(
            @RequestBody ElevatorRequestDTO requestDTO,
            @RequestHeader("Authorization") String authorization) {
        return elevatorPushService.getRealtimeData(requestDTO);
    }
}

在上述代码中我们加了请求头@RequestHeader("Authorization"),并且在swagger中也看到了这个参数,但在请求的时候却没有这个字段,其他自定义的header是有的。

curl -X 'POST' \
  'http://localhost:8085/api/v1/media/getPeriodicData' \
  -H 'accept: */*' \
  -H 'Content-Type: application/json' \
  -d '{
  "leaveFactoryNumber": "string"
}'

终于在Swagger的官网上找到了问题关于请求头的网址,原来官方上给出了说明,这些头部字段是被禁止使用的Content-Type,Accept, Authorization。解决方法是使用securitySchemes, security

下面我们参考bearer授权的地址修改下程序。

@Slf4j
@RestController
@Tag(name = "数据交互接口", description = "运行,统计数据等接口 - 开发者:(chenxue)")
@RequestMapping("/api/v1")
@SecurityScheme(name = "bearer-key", scheme = "bearer", type = SecuritySchemeType.HTTP)
public class ElevatorPushController {
    private final ElevatorPushService elevatorPushService;

    @Operation(summary = "获取电梯实时运行数据", security = {@SecurityRequirement(name = "bearer-key")})
    @PostMapping("/media/getRealtimeData")
    public SingleResponse<ElevatorPushRunningWithPeriodicDTO> getRealtimeData(
            @RequestBody ElevatorRequestDTO requestDTO,
            @Parameter(hidden = true) @RequestHeader("Authorization") String authorization) {
        return elevatorPushService.getRealtimeData(requestDTO);
    }
}

现在我们只需要点击 Authorize按钮,将authorization的值输入进去,Authorize一下, 后面我们使用swagger请求的时候就自动带了这个头部信息。

curl -X 'POST' \
  'http://localhost:8085/api/v1/media/getPeriodicData' \
  -H 'accept: */*' \
  -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzaG1hc2hpbmUiLCJzdWIiOiJnYXRld2F5LWNpdHktcGxhdGZvcm0tbXgyMDQiLCJleHAiOjE2Nzk5ODgzNjYsImlhdCI6MTY3OTkwMTk2NiwianRpIjoiY2ViZjgwMTItMzhjYS00NGNmLThiOGMtMWYyZTc4MWM1ODE0In0.larApxSqOa7qltCWdbK2b2x-OPJy9IvpgV-RwBmdeSg' \
  -H 'Content-Type: application/json' \
  -d '{
  "leaveFactoryNumber": "string"
}'

终于能正常使用swagger设置header认证了。

另外如果只是希望头部添加自定义的认证, 比如都需要在头部添加 user_id 则可以使用这种写法


// Controller类上设置
@SecurityScheme(name = "user_id", type = SecuritySchemeType.APIKEY, in = SecuritySchemeIn.HEADER)

// 方法上调用
@Operation(summary = "获取项目的KPI统计信息", security = {@SecurityRequirement(name = "user_id")})

这样就可以在swagger认证的时候添加user_id, 所有需要认证的swagger请求都会添加header user_id 字段了。

(4009)

Related Post