apache/servicecomb-java-chassis

Servicecomb 3.0.2 客户端使用 三方调用, 请求头 Authorization 好像无法远程调用传参

Closed this issue · 5 comments

    @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 宝哥, 抽空可以帮忙看下, 是不是类似场景后面, 就不要用 RPC了, 只用 REST

有没有简单分析下原因?需要测试下看看是什么情况。

有简单分析下原因?需要测试下看看是什么情况。

https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md

分析了. 应该是swagger 3.0 禁用了 Authorization header. 需要特殊的配置. 但是在RPC 场景不知道咋配置了.

image

试了一下规避方案, 没问题, 首字母大写. 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);

}

3.1.1