node.js - 使用 Node.js 访问 NTLM Api
问题描述
完全免责声明:我以前从未与 Microsoft 的 NTLM 合作过。
我已经尝试了大约 30 种不同的方式来访问我们本地 TFS 实例上的 7Pace timetracker API。我知道如果我直接在 Chrome 中访问 URI,它会起作用,它会提示我输入我的 AD 登录名,并迅速为我提供所有请求的数据。Postman 也一样,除了 NTLM 提前有一个身份验证选项卡。
Postman 使用请求为 Node.js 建议:
var request = require("request");
var options = {
method: 'GET',
url: 'http://TFSURL/odata/TimeExport%28StartDate=%272018-11-14%27,EndDate=%272018-11-14%27%20,PopulateTopParentColumns=null,GroupTimeByDateByUser=null,IncludeBillable=null%29',
headers: {
'cache-control': 'no-cache',
Authorization: 'NTLM NOTTHEREALTOKENKJASDKLHWKLLASBEDBSDAOBAW'
}
};
request(options, function (error, response, body) {
if (error) throw new Error(error);
console.log(body);
});
这不返回任何内容。注意 Authorization 标头。我已经测试了多种不同的类似变体。我的下一个猜测是通过 Chrome 请求,然后用 Tellerik Fiddler 嗅探它并尝试复制标头。我也这样做了,但没有用。我最终得到了与上面非常相似的结果,除了 chrome 使用协商:
关于如何解决这个问题的任何想法?也许其他调试选项?
解决方案
您将需要通过 3 个 NTLM 身份验证步骤。如果您想手动执行此操作并不容易,因为 NTLM 规范并未真正开放。
您可以使用 Node.js 模块:https ://www.npmjs.com/package/httpntlm (免责声明:我创建了它)
要获取您的网址,您需要以下内容:
var httpntlm = require('httpntlm');
httpntlm.get({
url: "http://tfs2:8090/api/FlexPOS%20APS/odata/TimeExport%28StartDate=%272018-11-14%27,EndDate=%272018-11-14%27%20,PopulateTopParentColumns=null,GroupTimeByDateByUser=null,IncludeBillable=null%29",
username: 'your username',
password: 'your password',
workstation: 'anything',
domain: ''
}, function (err, res){
if(err) return err;
console.log(res.headers);
console.log(res.body);
});
推荐阅读
- python - 在 Django 中迁移应用程序时,我一直没有检测到任何更改
- php - XAMPP 7.2.13 php -ext-int 扩展错误
- python - 如何从用户输入中调用列表项
- android - 如何从 JSON 结果中检索流派
- linux - 无法构建 GNU automake - help2man 无法从 automake-1.16 获取 `--help' 信息
- c++ - 我收到错误“变量的类型不完整”,但我找不到问题所在
- ios - 在 Swift 的 spritekit 游戏中定义我的宇宙飞船运动
- c# - 如何在 C# 中创建一个填充两个 DataGridView 的函数
- gradle - 哪个文件 gradle.properties 优先级更高?
- python - 熊猫:不能将序列乘以“str”类型的非整数