【问题标题】:Base64 Encoding Basic Authentication Header Apache HTTP ClientBase64 编码基本身份验证标头 Apache HTTP 客户端
【发布时间】:2011-12-01 08:18:51
【问题描述】:

两个相关问题,我使用的是 Apache HTTP Client 4.x API。 myHttpPost 是 HttpPost 的一个实例,而 myHttpClient 是 HttpClient 的一个实例。我正在尝试使用基本身份验证发送请求。所以我有一个 HttpClient 并创建一个 HttpPost。

设置基本身份验证标头的“蛮力”方法似乎是将其设置在 HttpPost 标头中。

String encoding = Base64Encoder.encode("username" + ":" + "password");
myHttpPost.setHeader("Authorization", "Basic " + encoding);

上面的例子来自另一个堆栈溢出问题(现在找不到指向它的链接)。关于 Base64Encoder 类 - 我会在哪个包中找到它或从哪里下载它?

主要问题 - 我希望使用以下代码以更美观的方式进行基本身份验证:

myHttpClient.getCredentialsProvider().setCredentials(
    new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, AuthPolicy.BASIC),
    new UsernamePasswordCredentials("username", "password")
);

但这似乎不起作用。那么上面的第一个示例是使用 Apache HTTP Client 4.0 进行基本身份验证的正确方法吗?还是有更清洁/更简单的方法。

【问题讨论】:

    标签: java apache authentication httpclient basic-authentication


    【解决方案1】:

    关于 Base64Encoder 类 - 我会找到哪个包 在哪里下载?

    Base64Encoder 可以来自不同的地方,我找不到与你的静态 encode 方法匹配的东西。

    至于凭据,您需要在您的AuthScope 上将scheme 设置为Basic,如下所示:

    myHttpClient.getCredentialsProvider().setCredentials(
        new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, "basic"),
        new UsernamePasswordCredentials("username", "password")
    );
    

    myHttpClient.getCredentialsProvider().setCredentials(
        new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, AuthPolicy.BASIC),
        new UsernamePasswordCredentials("username", "password")
    );
    

    【讨论】:

    • 感谢 TEG - 我尝试了这个但没有成功(尝试了文本“基本”和常量。)。我已更新问题以反映此附加参数。 base 64 编码的标头确实有效,但解决方案有效。
    【解决方案2】:

    我知道这是一篇很老的帖子。但是,只是想回答一下,以便其他人将来受益:

    如果您使用的用户名将使用可变宽度编码 (http://en.wikipedia.org/wiki/Variable-width_encoding) 表示,请确保更改用于形成 (username:password) 字节的编码,如下所示: HttpParams 参数 = new BasicHttpParams(); params.setParameter(AuthPNames.CREDENTIAL_CHARSET, HTTP.UTF_8);

    默认情况下,使用的编码是 HttpProtocolParams.HTTP_ELEMENT_CHARSET。

    【讨论】:

      【解决方案3】:

      HttpClient 不会尝试向源服务器或代理服务器进行身份验证除非明确提出质疑。我怀疑您希望HttpClient 抢先进行身份验证。虽然默认情况下禁用了抢占式身份验证(我个人不鼓励将其应用到安全或内部网络之外),但可以使用下面的示例强制进行抢先式身份验证

      http://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientPreemptiveBasicAuthentication.java

      【讨论】:

      • 感谢 oleg 的回复 - 太忙了,无法验证它是否有效,但会得到它。
      【解决方案4】:

      我尝试了http://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientPreemptiveBasicAuthentication.java 中建议的解决方案,它适用于 Base64 编码基本身份验证。 我猜是

       // Create AuthCache instance
       AuthCache authCache = new BasicAuthCache();
       // Generate BASIC scheme object and add it to the local
       // auth cache
       BasicScheme basicAuth = new BasicScheme();
       authCache.put(target, basicAuth);
      
       // Add AuthCache to the execution context
       HttpClientContext localContext = HttpClientContext.create();
       localContext.setAuthCache(authCache);
      

      创造奇迹:) 因为没有这个,我总是收到“401 Unauthorized”的 HTTP 响应

      【讨论】:

      • 我猜你答案的第二个单词有错字。 “累了” -> “试过了”
      猜你喜欢
      • 1970-01-01
      • 2011-05-05
      • 2018-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-23
      相关资源
      最近更新 更多