Apache HttpClient 摘要式身份验证

2024-05-01

基本上我需要做的是执行摘要身份验证。我尝试的第一件事是可用的官方示例here http://svn.apache.org/repos/asf/httpcomponents/httpclient/tags/4.0.1/httpclient/src/examples/org/apache/http/examples/client/ClientAuthentication.java。 但是当我尝试执行它时(进行一些小的更改,Post 而不是 Get 方法)我得到一个

org.apache.http.auth.MalformedChallengeException: missing nonce in challange
at org.apache.http.impl.auth.DigestScheme.processChallenge(DigestScheme.java:132)

当失败时我尝试使用:

DefaultHttpClient client = new DefaultHttpClient();
client.getCredentialsProvider().setCredentials(new AuthScope(null, -1, null), new UsernamePasswordCredentials("<username>", "<password>"));

HttpPost post = new HttpPost(URI.create("http://<someaddress>"));
        List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("domain", "<username>"));
post.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));

DigestScheme digestAuth = new DigestScheme();
digestAuth.overrideParamter("algorithm", "MD5");
digestAuth.overrideParamter("realm", "http://<someaddress>");
digestAuth.overrideParamter("nonce", Long.toString(new Random().nextLong(), 36));
digestAuth.overrideParamter("qop", "auth");
digestAuth.overrideParamter("nc", "0");
digestAuth.overrideParamter("cnonce", DigestScheme.createCnonce());

Header auth = digestAuth.authenticate(new
      UsernamePasswordCredentials("<username>", "<password>"), post);
System.out.println(auth.getName());
System.out.println(auth.getValue());
post.setHeader(auth);


HttpResponse ret = client.execute(post);
ByteArrayOutputStream v2 = new ByteArrayOutputStream();
ret.getEntity().writeTo(v2);
System.out.println("----------------------------------------");
System.out.println(v2.toString());
System.out.println("----------------------------------------");
System.out.println(ret.getStatusLine().getReasonPhrase());
System.out.println(ret.getStatusLine().getStatusCode());

起初,我只覆盖了“realm”和“nonce”DigestScheme 参数。但事实证明,在服务器上运行的 PHP 脚本需要所有其他参数,但无论我是否指定它们,当我调用其authenticate() 方法时,DigestScheme 都不会在 Authorization RequestPreperty 中生成它们。 PHP 脚本返回 HTTP 响应代码 200,并显示 PHP 脚本需要 cnonce、nc 和 qop 参数的消息。

我已经为此苦苦挣扎了两天,但没有运气。根据一切,我认为问题的原因是 PHP 脚本。在我看来,当应用程序尝试未经授权访问它时,它不会发出挑战。

有人有什么想法吗?

编辑: 另一件事是,我尝试使用 cURL 连接并且它有效。


这个代码片段对我有用。您必须提供通过查看从主机获得的 401 响应标头可以获得的领域。

val credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(AuthScope.ANY,
  new UsernamePasswordCredentials(user, password));
val authCache = new BasicAuthCache();
val digestScheme = new DigestScheme();

digestScheme.overrideParamter("realm", "**Name of the Realm**");
// Nonce value
digestScheme.overrideParamter("nonce", "whatever");

authCache.put(targetHost, digestScheme);

context.setCredentialsProvider(credsProvider);
context.setAuthCache(authCache);

val httpget = new HttpGet(url);

val response = httpClient.execute(targetHost, httpget, context);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apache HttpClient 摘要式身份验证 的相关文章

随机推荐

  • 如何隐藏 WebBrowser 直到网站完成加载/下载过程?

    我想知道我该如何隐藏WebBrowser直到网站加载过程完成 另外 我使用 Panel1 和WebBrowser在它的上面 为什么 好吧 这样 我可以完全像我想要的 WebBrowser 一样设置 Panel1 的大小和位置 然后将 Web
  • R 图在从 r 变量读取文本时使用 html 进行格式化

    我正在使用 R 包绘图器创建流程图 为了获得所需的格式 粗体 项目符号 左对齐 我可以在 html 中编写节点标签 但是 我还想通过调用 R 中的变量来填充一些文本 但我不知道如何同时执行这两项操作 html 格式化 调用 R 变量 在此代
  • 如何在RTK查询中配置存储多个中间件

    redux toolkit 给出了原始文档 import configureStore from reduxjs toolkit Or from reduxjs toolkit query react import setupListene
  • 谷歌地图转弯 GPS 导航用于 ios 开发

    我的应用程序需要包含逐段 GPS 导航 任何人都可以告诉如何集成谷歌地图进行逐段 GPS 导航 我可以在android开发中找到它 但我无法从谷歌地图的iOS开发文档中找到导航 https developers google com map
  • 键盘挂钩获取组合键(WPF)

    我尝试在这里使用这篇文章 在 WPF C 中使用全局键盘钩子 WH KEYBOARD LL https stackoverflow com questions 1639331 using global keyboard hook wh ke
  • Firemonkey 移动应用程序和远程 MySQL

    我正在使用 Delphi XE5 并且我已经创建了基本的 Firemonkey 移动应用程序 Delphi 我想连接到远程 MySQL 数据库 我应该使用哪一个数据库管道 FireDAC DBExpress 等 您可以使用标准 TSQLQu
  • UICollectionView 就像 iOS 主屏幕 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想制作一个像 iOS 主屏幕一样的 UICollectionView 我发现了几个 而且很好的 样本 例如 http mobile tu
  • 尝试使用 SwiftMailer 和 Sendgrid 发送电子邮件时出现致命错误

    我在尝试使用 swiftmailer 和 sendgrid smtp 发送电子邮件时收到此错误 致命错误 未捕获异常 Swift TransportException 消息 预期响应代码 250 但收到代码 消息 这是我的代码 hdr ne
  • 如何找到向量中第一个小于整数 X 的元素? (c++)

    如果我有以下向量 10 10 10 20 20 20 30 30 我想要一个函数返回 X 的整数的位置或直接返回 X 之后的较小元素 例如如果我正在搜索 11 我希望函数返回 2 因为第二个元素 10 是第一个较小的元素向量中大于 11 的
  • 从 WasapiLoopbackCapture 捕获音频,并转换为 muLaw

    我正在使用 WasapiLoopbackCapture 捕获音频 format IeeeFloat SampleRate 48000 BitsPerSample 32 我需要将其转换为 muLaw 8Khz 8 位 单声道 最终它将通过 S
  • 世博会错误 - 无法加载所有资源

    由于某种原因 当第一次使用命令启动我的应用程序时expo r ci no dev我收到Failed to load all assets error 收到错误的图像 https i stack imgur com pcvv4 png 如果我
  • 为什么 x = x +1 在 Elixir 中有效?

    我读到的有关 Elixir 的所有内容都表明 赋值应该被视为模式匹配 如果是这样 为什么 x x 1 在 Elixir 中有效 不存在 x x 1 的 x 值 我读到的有关 Elixir 的所有内容都表明 赋值应该被视为模式匹配 在长生不老
  • 使用 JAX-WS 的 SOAP 消息中的嵌套标记中没有命名空间

    我正在尝试使用 JAX WS 和 wsimport 编写一个使用给定 Web 服务的 Java 应用程序 它发送到服务的 SOAP 消息大部分是正确的 然而 传递给服务函数的参数之一是字符串数组 尽管在 SOAP XML 中为数组本身指定了
  • 椭圆绘制WPF动画

    我正在开发一个矩形区域的控件 当触发发生时 将在矩形区域中绘制一个椭圆形 该控件将能够承载其他控件 例如文本框 按钮等 因此在触发时将在它们周围绘制圆圈 我希望将圆圈绘制为动画 就像您用笔圈出内部控件一样 实现这一目标的最佳方法是什么 我一
  • Angular 2 中不同模块组件的通信

    我有一个组件 我希望它将数据传递给另一个模块中的另一个组件 其实我的app component是这些子模块的父模块 我希望每个子模块发送一些数据到app component 但他们只是在路由意义上才是孩子和父母 所以我猜他们实际上并不是父母
  • Crystal Reports - 根据数据隐藏文本和绘图对象

    我在 Crystal Report 上有一个文本和绘图 如果数据字段 IsVisible 设置为 1 我想隐藏它 有没有一种简单的方法可以做到这一点 您可以有条件地抑制字段 文本 图片所在的整个部分 方法是转到 部分专家 gt 选择所需的部
  • 如何将网格转换为VTK格式?

    我有一个自己格式的网格 我想将其导出到 vtk 文件 我该怎么做呢 原始网格的格式如下 伪代码 class Mesh List
  • 在 Solaris 上,使用 gcc 编译的库与使用 cc 生成的库的使用方式是否相同?

    我目前正在尝试编译 libxml2在 Solaris 上 当我运行源代码提供的 configure 脚本时 会自动使用 gcc 和 g 编译器 但是 我想使用 cc 和 CC 编译器 所以我跑 configure CC cc CXX CC
  • ILMerge:重命名内部化程序集的命名空间?

    例如 假设我想使用充气城堡 http www bouncycastle org csharp 在我的 DLL 中 由于我想简化部署 因此我使用 ILMerge 来组合MyDll dll and BouncyCastle Crypto dll
  • Apache HttpClient 摘要式身份验证

    基本上我需要做的是执行摘要身份验证 我尝试的第一件事是可用的官方示例here http svn apache org repos asf httpcomponents httpclient tags 4 0 1 httpclient src