Apache olingo基本身份验证编码问题

时间:2017-10-06 05:30:32

标签: java encoding authorization olingo

我正在使用Apache olingo开发OData客户端,凭据包含本机字符,应该使用UTF-8读取“授权”标头的Base64编码。 第一种方法是Olingo建议的标准:

EdmEnabledODataClient client = ODataClientFactory.getEdmEnabledClient(endpointURI, ContentType.JSON);
client.getConfiguration().setHttpClientFactory(new BasicAuthHttpClientFactory(username, password));

但这对我没有用,因为Olingo在US-ASCII字符集中为Base64编码读取“用户名”和“密码”字节,我的用户名转到??? 。 在HTTP客户端级别,有一种方法可以将charset传递给 org.apache.http.impl.auth.BasicSchemeFactory ,但我发现无法在Olingo级别上自定义它。

我的第二次尝试是添加原始标题:

URI searchURI = client.newURIBuilder(endpointURI)
            .appendEntitySetSegment(segment)
            .top(10)
            .addQueryOption(QueryOption.FORMAT, "json")         
            .build();
    ODataEntitySetRequest<ClientEntitySet> request = client.getRetrieveRequestFactory().getEntitySetRequest(searchURI);
    String auth = Base64.encodeBase64String(String.format("%s:%s", username, password).getBytes(StandardCharsets.UTF_8));
            request.addCustomHeader("Authorization", "Basic "+ auth);
    ODataRetrieveResponse<ClientEntitySet> response = request.execute();

但似乎Olingo实际上在request.execute调用下发送了2个HTTP请求。第一个是数据,它包含我的标题,传递授权并返回数据 - 很好。但是第二个请求是针对元数据的,没有授权标头,并返回401 Unauthorized。所以最后的结果是例外。 我需要一种方法来添加基本身份验证。这将通过完整的Olingo请求周期(多个http请求,并使用UTF-8字符集作为我的凭据。或者,以某种方式禁用元数据调用(如果Olingo总是将其用于响应对象构造,则可能无法实现)

1 个答案:

答案 0 :(得分:3)

找到了一个解决方案,但仍然对Olingo推荐的方式感兴趣

            EdmEnabledODataClient client = ODataClientFactory.getEdmEnabledClient(endpointURI, ContentType.JSON);
            final String auth = Base64.encodeBase64String(String.format("%s:%s", username, password).getBytes(StandardCharsets.UTF_8));
            client.getConfiguration().setHttpClientFactory(new DefaultHttpClientFactory() {
                @SuppressWarnings("deprecation")
                @Override
                public DefaultHttpClient create(HttpMethod method, URI uri) {
                    final DefaultHttpClient client = super.create(method, uri);
                    client.addRequestInterceptor(new HttpRequestInterceptor() {
                       @Override
                       public void process(HttpRequest request, HttpContext context) throws HttpException, IOException {
                           request.addHeader("Authorization", "Basic " + auth);
                    }
                });
                return client;
            }
        });