Is it possible to use Digest-Authentication with a XMLHTTPRequest?
我有一个简单的问题:是否可以对xmlhttpRequest使用摘要式身份验证?
如果答案是否定的,那么技术原因是什么?或者如果可能的话-我该怎么做?
非常感谢……到目前为止,谷歌还没有一个好答案:-/
编辑:
谢谢你的回答。在接收到nonce之后,修改头以匹配摘要式身份验证方案似乎是一种解决方案。
但我真正想要的是我可以更改当前的调用:xmlhttp.open("get",url,false,username,password");像xmlhttp.open("get",url,false,username,password,"digest");
这也是我最初的问题的一部分:为什么open方法不提供生成摘要请求的选项?
也许有一个JSLIB可以推荐让我这样做——就像你想象的那样,我真的不想把一个简单的xmlhttp.open更改为多个请求,然后首先得到一个nonce。
你能做到没问题。只需遵循您所感兴趣的部分规范即可;)http://tools.ietf.org/html/rfc2617并且您只需要开始在客户端编写身份验证库http://pajhome.org.uk/crypt/md5/。
预交换用户名和密码嘿,我想验证---->服务器好的,这是一个nonce/salt---->客户下面是我的用户名密码时间戳和salt服务器的MD5哈希和我只是用和你一样的方法设置了你的密码和用户名,它们是相同的----->客户机这些都是它的基础。
我遗漏了您需要在hashsum中包含请求资源的URI!!!!!当然,对于向服务器发出的每一个资源请求,您都要这样做,这样一些截取哈希的人只能查看您请求的内容,不能对其他资源发出请求。此方法不能确保数据的安全,只需访问它。
请看本文:http://marcin michalski.pl/2012/11/01/javascript digest authentication restful webservice spring security javascript ajax/。它解释了如何在服务器端使用SpringSecurity进行JavaScript客户机摘要式身份验证。代码在github中提供:https://github.com/arrowgroup/jsdightauth
我已经为此编写了完整的工作流,一旦您使用MD5的外部库(我使用CryptoJS),就完全不难了。
您可能遇到的最大问题是,在第一台服务器401上,回复任何最常用的浏览器都会打开一个对话框来获取您的凭证。据我所见,没有一种简单的方法可以避免这种情况:我如何抑制浏览器的身份验证对话框?
为了解决这个问题,我修改了从C codeplex项目编码的Web服务器。在第一个请求中,客户机传递一个"警告"头,表示"不要引发401"。服务器创建了这个挑战,并用一个定制的、非401的httpexception(目前我使用406,这在http中是"不可接受的")将其发送回来。客户机创建散列并将其发回。
如果有人感兴趣,我可以发布一些代码片段,这是一个老问题。
为了避免默认的浏览器身份验证对话框,您只需将www authenticate设置为digest/yourstring(例如,您的领域)。一切都在第一反应中,不是那么悲惨。我的自定义代码直到昨天才完全正常工作,现在我正在尝试调试突然发生的奇怪的事情,仍在尝试理解。
只要您的浏览器支持,您就真的不应该关心站点使用哪种身份验证方法。
如果您指定用户名和密码以打开方法,并且不干扰授权头,xmlhttprequest.send()将首先尝试在不进行身份验证的情况下发送请求,使用www-authenticate头接收401响应,然后重试请求,根据站点请求的授权方法提供名称和密码。
(尽管在这两个阶段的过程中可能会触发一些额外的事件处理程序)。
最好的方法是使用SSL。我认为不存在任何其他安全解决方案(如果我错了,请纠正我)