Servicecomb 3.0.2 客户端使用 三方调用, 请求头 Authorization 好像无法远程调用传参
Closed this issue · 5 comments
heyile commented
@Primary
@Bean
public RegistryBean thirdRegistry() {
String endpoint = "rest://xx.xx.xxxxx:8004?sslEnabled=false";
String version = "1.0.0";
return new RegistryBean().addSchemaInterface("viam-authentication-local", TestServiceApi.class)
.setAppId("xxx")
.setServiceName("viam-authentication-local")
.setVersion(version)
.setInstances(new RegistryBean.Instances()
.setInstances(List.of(new RegistryBean.Instance().setEndpoints(List.of(endpoint)))));
}
@Primary
@Bean
public TestServiceApi testApiClient() {
return Invoker.createProxy("viam-authentication-local",
"viam-authentication-local", TestServiceApi.class);
}
@RequestMapping(path = "/")
public interface TestServiceApi {
@Operation(summary = "xxx", description = "xxx")
@GetMapping(value = "/health/check2", produces = {"application/json"})
TenantDetailInfo getTenantDetailInfo(
@RequestHeader(value = "test") String test,
@RequestParam(value = "param") String param,
@Parameter(description = "Authorization header", required = true, in = ParameterIn.HEADER,
name = "Authorization") @RequestHeader("Authorization") String authorization);
}
类似如下远程调用的时候, header Authorization 无法传出去
public class QueryViamTokenController {
private final TestServiceApi serviceApi;
public QueryViamTokenController(TestServiceApi serviceApi) {
this.serviceApi = serviceApi;
}
@GetMapping(value = "/xxx")
@Operation(summary = "xxx", tags = "")
public Object getW3UserInfoToken() {
try {
return serviceApi.getTenantDetailInfo("test", "param", "auth");
} catch (Exception e) {
log.error("failed to get te", e);
return null;
}
}
}
升级了 swagger 3.0 之后, RPC 调用, 想要传参 Header Authorization, 好像传不出去, 服务端收到请求 Authorization 一直为 null
liubao68 commented
有没有简单分析下原因?需要测试下看看是什么情况。
heyile commented
有简单分析下原因?需要测试下看看是什么情况。
https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md
分析了. 应该是swagger 3.0 禁用了 Authorization header. 需要特殊的配置. 但是在RPC 场景不知道咋配置了.
heyile commented
试了一下规避方案, 没问题, 首字母大写. Authorization 这里首字母大写, 不过有点丑
@RequestHeader("Authorization") String Authorization);
@RequestMapping(path = "/")
public interface TestServiceApi {
@Operation(summary = "xxx", description = "xxx")
@GetMapping(value = "/health/check2", produces = {"application/json"})
TenantDetailInfo getTenantDetailInfo(
@RequestHeader(value = "test") String test,
@RequestParam(value = "param") String param,
@Parameter(description = "Authorization header", required = true, in = ParameterIn.HEADER,
name = "Authorization") @RequestHeader("Authorization") String Authorization);
}
liubao68 commented
3.1.1