NodeJS-与正在尝试ntlm身份验证但遇到奇怪行为的服务器进行通信

时间:2019-03-01 21:37:25

标签: node.js ntlm http-authentication nightmare

我正在尝试编写代码,以允许我的nodeJS服务器抓取另一个试图运行ntlm身份验证的网站。当我到达页面时,会出现一个弹出窗口,我应该在其中输入凭据来访问该站点。但是,该弹出窗口似乎不是chrome的一部分,而是OS的一部分。无论我尝试什么,都无法在页面的元素中找到它,这使我认为它是OS的一部分。 (我在开发计算机上运行Windows 10,但是将执行刮取操作的计算机正在运行linux)。我对此的另一个证据是,当我使用噩梦降落在网站上时,不会出现弹出窗口。

我发现此弹出窗口是对ntlm身份验证的尝试,我通过记录标题并找到了'www-authenticate': 'Negotiate, NTLM'标题来发现这一点。

我以前从未做过ntlm身份验证,并且做了很多研究咨询很多文章,包括:

  1. this one here on stackoverflow
  2. the microsoft documentation on http-authentication

我可能只是误会了它,但从我读到的内容来看。 NTLM身份验证是一种身份验证协议,其中服务器和客户端进行多次通信,要求客户端对服务器发送给它的质询进行解码,然后客户端用自己的加密消息发送回响应(在Microsoft的文档中,将其称为设为ntlm类型1,类型2和类型3消息)。一旦客户端进行了这些连续的“握手”,便会为客户端提供一个令牌,该令牌将放置在所有将来请求的授权标头中,这将允许客户端访问该域中的资源。

但是,当我发出一个get请求(使用请求模块)并检查www-authenticate标头时,没有看到需要解码的base64加密质询。它说的只是“谈判,NTLM”。但是,有另一个标头已发回,看起来像'set-cookie': ['PMPRSTTCKT=!lcWXt/hXXO4xZHh0zm3oec8PLsnWcoTFk3sxytyUFAh/vYSo90MBtWpKI48G5L7mFdWMteNN5Q2Khfo=; expires=Fri, 01-Mar-2019 21:06:12 GMT; path=/; Httponly; Secure']。我不确定此Cookie是否错误地是从服务器发送回的挑战,是否只是开发团队的编码不佳。

据我了解,这不是ntlm身份验证的预期行为。我希望这个标题包含挑战。你们中的任何人都具有NTLM身份验证的经验,并且可以了解这里发生的事情吗?

目标是利用噩梦抓取网站并下载一些报告,并对下载的报告进行一些分析。在完成此操作之前,需要回答几个问题:

  1. 很明显,我需要以某种方式对网站进行身份验证
  2. 以某种方式允许噩梦访问身份验证令牌,或者在噩梦或电子环境中进行ntlm身份验证,以便我的刮板可以不间断地通过站点。

1 个答案:

答案 0 :(得分:0)

您可以使用以下模块,该模块已经在javascript / node.js中实现了ntlm身份验证协议:https://www.npmjs.com/package/httpntlm