如何使用不可重复的HttpEntity和身份验证挑战?

时间:2016-12-03 14:46:25

标签: java authentication apache-httpclient-4.x bearer-token

我构建一个客户端,基本上需要从需要身份验证的端点发送和检索文件InputStream(必须是)。

我正在使用Apache HttpClient创建Bearer AuthScheme我使用特定的令牌来处理我们自己的令牌检索流程, :

@Override
public String getToken(Credentials credentials, HttpRequest request, HttpContext context) {
    return tokenProvider.getToken(getParameters(),
            request.getRequestLine().getMethod(),
            request.getRequestLine().getUri());
}

预计TokenProvider会自行提出从第三方服务中获取令牌的请求。

现在,我使用InputStreamEntity创建我的请求,这是不可重复的,因此第二次请求结束时会失败,流程为:

  1. 第一个请求以404
  2. 结束并失败
  3. 触发AuthSchem根据质询检索所需的令牌
  4. 客户端使用NonRepeatableRequestException
  5. 重新执行请求失败的请求

    我知道我可以使用Repeatable实体并完成它但我们可能会讨论非常(非常)大的文件,我不能简单地将它们缓冲到内存中。

    我还尝试使用HttpRequestInterceptor抢先执行第一个请求并根据它获得的挑战填充令牌缓存但是在我看来这是一个非常难看的流程,同时根据挑战检索令牌目前的要求即将到来。

    我也尝试过使用Jets3t' RepeatableRequestEntity这样做但我不想在不需要的地方包含依赖项,而且我还没有彻底测试它的性能。

    所以我的问题是:其他人怎么做到这一点?它不仅限于Bearer身份验证 - 您如何处理通过需要基于质询的身份验证的线路发送InputStream

0 个答案:

没有答案