apache HttpClient关于digest的一个大坑
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了apache HttpClient关于digest的一个大坑相关的知识,希望对你有一定的参考价值。
一个简单的http请求,花了我将近一天的时间,只因为HttpClient的一个实现与规范有些不一致。
服务器使用了digest认证,使用的是nginx,我们用ios,js写的程序都可以顺利访问,浏览器、curl自然也都不在话下,但java程序访问总是报401或者400的错误。
抓包分析,自己写程序比对程序生成的response值,都没有问题,打开nginx的日志,只看到报错,也没有说明报错原因。
后来仔细比较正常请求和java程序发出的请求,发现java发出的请求中qop和algorithm两个字段的值没有带双引号。
尝试升级HttpClient到最新版,还是一样。
尝试使用OKHttp,发现不支持digest认证,安装了一个第三方的扩展okhttp-digest,这个也是从HttpClient中扣出来的,所以也有相同的问题。
最后没有办法,重写了相关方法,把qop和algorithm两个字段加上引号,重新运行,返回http 200了。
这肯定是httpclient和nginx不兼容,两者都是工业级的成熟工具,怎么能出这种低级错误呢?我得给他们做个裁判。
看了标准规范RFC2617,发现对这一块也没有非常明确的要求,但有要求auth-req中这两个值是带引号的,auth-resp没有明确,但理论上讲nginx更有道理些,所以板子打到httpclient上面。
最终实现代码(略)
以上是关于apache HttpClient关于digest的一个大坑的主要内容,如果未能解决你的问题,请参考以下文章
Apache HTTPClient DigestAuth 不转发来自 Challenge 的“不透明”值
Apache HttpClient DigestAuth - 401,未经授权。但是凭证没问题[重复]
为啥来自其他用户的 Digest 身份验证 Java HttpClient 代码对我不起作用? [复制]
启动tomcat直接报错:org.apache.tomcat.util.digester.Digester startElement