nodejs 实现http账号密码Digest登录认证

2023-05-16






const http = require('http');
const qs = require('querystring');
const md5 = require('md5-node');

//第一步:获取nonce
let authenticate = ''; 
http.get("http://admin:woshimima123456@110.110.110.110", function (gres) {
    gres.on('data', function (d) {
    }).on('end', function () {
        http.get(gres.headers.location, function (inres) {
            inres.on('data', function (d) {
            }).on('end', function () {
                //获取nonce
                authenticate = inres.headers['www-authenticate'];
                // console.log(authenticate);
                // let nonce = authenticate.match(/\snonce="([^"]+)/)[1];
                // let opaque = authenticate.match(/\sopaque="([^"]+)/)[1];
                // console.log(nonce, opaque);
            });

        });
    });
}).on('error', function (e) {
    console.log("Got error: " + e.message);
});

//----------------------------------------------------------------
//第二步:获取使用nonce生成response
let index = 66;
let tno = 9230;
let outno = '867316666666';
let post_data = {
            SlcType: 1,
            CompanyGroup: 0,
            DepartmentGroup: 0,
            ExtCaller: outno,
            IntCaller: tno,
            Password: '0000',
            LowClass: 0,
            uatt_fxs_class_high_mask: 1,
            HighClass: 11,
            uatt_ptt_active_high: 1,
            ptt_talk_class: 0,
            ptt_call_mode: 0,
            uatt_em_four_line: 0,
            uatt_em_tle: 0,
            uatt_em_mode: 0,
            uatt_em_tleid: 0,
            uatt_em_protocol: 0,
            uatt_em_wink_tck: 0,
            em_ptt_talk_class: 0,
            em_ptt_call_mode: 0,
            uatt_cs_ring_count: 0,
            uatt_cs_ring_interval: 0,
            outGain_selobj: 0,
            outGain: 255,
            inGain_selobj: 0,
            inGain: 255,
            HotPhone: "",
            ok: "%C8%B7%B6%A8",
        }; //这是需要提交的数据
        var content = qs.stringify(post_data);

        let SetTemplate = 'Digest username="admin", realm="woshi_realm", nonce="51f900843858f5a59c93c19ddf96f4e1", uri="/ndms/CfgLineUserSetItem?index=66", algorithm=MD5, response="e25910a4aec0bb4e11372fe5ff8e92cd", opaque="5ccc069c403ebaf9f0171e9517f40e41", qop=auth, nc=0000000d, cnonce="00b090339f294b5c"';
        let nonce = authenticate.match(/\snonce="([^"]+)/)[1]; //从服务器获取的nonce 
        let uri = `/ndms/CfgLineUserSetItem?index=${index}`;
        let cnonce = SetTemplate.match(/\scnonce="([^"]+)/)[1];
        let nc = SetTemplate.match(/\snc=([^,]+)/)[1];

        let a1Hash = md5("admin: :woshimima123456");
        let a2Hash = md5(`POST:${uri}`);
        //这里的response计算是关键!!!通过md5计算拼接好的字符串
        let response = md5(`${a1Hash}:${nonce}:${nc}:${cnonce}:auth:${a2Hash}`);
        let finalSetAuth = SetTemplate.replace(/index=\d+/, `index=${index}`).replace(/response="[^"]+"/, `response="${response}"`)
            .replace(/\snonce="[^"]+"/, ` nonce="${nonce}"`);
        // console.log(response);
        // console.log(finalSetAuth);

        var options = {
            host: '110.110.110.240', //请求服务器地址
            port: 80,
            path: uri,
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
                'Content-Length': content.length,
                'Authorization': finalSetAuth
            }
        };
        // console.log("post options:\n", options);
        // console.log("content:", content);
        // console.log("\n");

        var req = http.request(options, function (res) {
            //    console.log( "statusCode: " , res.statusCode);
            //    console.log( "headers: " , res.headers);

            var _data = '';
            res.on('data', function (chunk) {
                _data += chunk;
            });
            res.on('end', function () {
                console.log("--->>")
                if (res.statusCode == '302') {
                    console.log("result:", "OK");
                } else {
                    console.log("\n--->>\nresult:", _data);
                }
                resolve("ook");
            });
        });

        req.write(content);
        req.end();

参考:

HTTP认证之摘要认证——Digest(一)

https://www.cnblogs.com/xiaoxiaotank/p/11078571.html

HTTP认证之摘要认证——Digest(二)

https://www.cnblogs.com/xiaoxiaotank/p/11079024.html

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

nodejs 实现http账号密码Digest登录认证 的相关文章

  • Qt进制转换,16进制转long ABCD/CDAB

    Qt进制转换 xff0c 16进制转long ABCD CDAB long hexToABCD const QString amp hexData 16进制转long ABCD 大端 bool ok char data 4 data 0 6
  • 进制转换,16进制与float互转

    include lt winsock h gt pragma comment lib 34 Ws2 32 lib 34 将一个8位数高低4位交换 static unsigned char bswap 8 unsigned char v re
  • QTextEdit/QPlainTextEdit控件自定义右键菜单功能失效

    1 问题描述 这两个控件原生自带的菜单只有 复制 和 选择全部 两个 想给这两个控件新增右键菜单 清除 QTextEdit ui gt textEdit gt document gt setMaximumBlockCount 200 设置最
  • 一文彻底搞懂为什么OpenCV用GPU/cuda跑得比用CPU慢?

    一 原因总结 最近项目需要 xff0c 发现了这个问题 网上找原因 xff0c 汇总起来 xff0c 有以下几点原因 xff1a 1 首先对于任何一个CUDA程序 xff0c 在调用它的第一个CUDA API时后都要花费秒级的时间去初始化运
  • solr学习二(ExtractingRequestHandler)

    size 61 large 通过ExtractingRequestHandler xff0c slor能够读取word pdf等文件 xff0c 并用于全文搜索 废话少说 xff0c 进入主题 xff1a color 61 darkred
  • 为什么函数参数const cv::Mat &img失效?仍旧可以修改const对象内容?

    1 举例如下 xff1a bool MainWindow readImage const QString amp path cv Mat img 61 cv imread path toStdString cv imwrite 34 d s
  • 我的Qt作品(18)模仿Qt Creator IDE写了一个轻量级的视觉框架

    Qt Creator的源码比较庞大 前几年我陆陆续续读过里面的源码 也写了几篇博文 xff1a https blog csdn net libaineu2004 article details 104728857 https blog cs
  • 关于turtlebot仿真报错The majority of dropped messages were due to..... 修改记录

    ros仿真过程中可能会出现类似错误 xff0c 雷达数据收不到 MessageFilter target 61 odom Dropped 100 00 of messages so far Please turn the ros gmapp
  • ESP32+WiFi+UART数据传输测试

    刚开始使用ESP32芯片 xff0c 摸索着实现了一个数据传输的功能 xff0c 记录下来以免忘记 实现功能 使用ESP32在服务器与下位机之间传输数据 xff0c 整体的流程图如下所示 如图所示 xff0c 下位机与ESP通过串口连接 x
  • ESP32+0.96寸OLED

    ESP32点亮0 96寸LED 考虑在上一篇的写那个项目中添加一个屏幕的显示 xff0c OLED屏幕为淘宝购买的6针型号蓝绿双色的屏幕 xff0c 通过四线SPI与ESP32连接 OLED屏电路图 OLED实物图 这是连接好运行后的图 x
  • ESP32+485(MODBUS RTU)

    1 背景 需要采集功率表的功率及电量数据 xff0c 考虑采用ESP32采集数据后发送给服务器 所需硬件 xff1a ESP32开发板 485从机 232转485芯片 图1 连接示意图 2 实现 数字功率表采用Modbus RTU模式进行数
  • Qt5.12.11交叉编译+64位ARM_aarch64+全志H5 CortexA53

    1 准备工作 购买的H5开发板 xff0c 附带资料里面只有关于qt4 8的支持 xff0c Qt5新增了很多插件 xff0c 为了在H5上运行Qt5的程序 xff0c 需要交叉编译Qt5版本的源码 xff0c 记录下编译Qt5 12 11
  • ESP32接入百度云,在线语音识别

    1开发环境及工具 开发板使用的是ESP32 LyraTv4 3 入下图所示 xff0c 开环境在是在Ubuntu20 04上搭建的ESP IDF xff0c 在ESP IDF中添加了支持语音开发的sdk xff0c ESP ADF 2开发过
  • ARM 7 三级 中断流水线

    ARM 7 在冯诺依曼 结构的 是三级流水线技术 分别是 取址 译码 执行 当有BL 的指令 执行时 流水线 也会被阻断 在分支指令执行的时候 其后第一条指令 被 解码 第二条 指令 被 取址 xff0c 当前的PC指针是 指在取址这的 x
  • S5PC100 I2C总线

    I2C 使用2根双向信号线来传递数据 SCL 时钟线 SDA 数据线 特点 半双功 xff0c 仅需要2根线 一般在PCU 上占2个PIN I2C 总线 上 都是 oc od 输出 xff0c 所以使用上拉电阻 当总线空闲的时候 都是输出
  • java代码自动生成一(freemarker)

    size 61 large 网上有很多代码自动生成工具 xff0c 如abator和hibernate xff0c 这些工具虽好 xff0c 却没有源码 xff0c 不能修改模板 xff0c 让人很不爽 我刚毕业的时候 xff0c 项目经理
  • linux内核 2.6.35下的驱动例子

    创建 设备节点 mknod dev hello c 字符设备 或者b xff08 块设备 xff09 250 1 查看 cat proc devices 当前设备节点 insmod 安装 rmmod 删除 编译 Makefile 1 需要配
  • E:Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)

    出现这个问题的原因可能是有另外一个程序正在运行 xff0c 导致资源被锁不可用 而导致资源被锁的原因 xff0c 可能是上次安装时没正常完成 xff0c 而导致出现此状况 解决方法 xff1a 输入以下命令 sudo rm var cach
  • shell 脚本中的引用问题

    原始代码如下 bin sh myvar 61 34 Hello world 34 echo myvar echo 34 myvar 34 echo 39 myvar 39 echo myvar echo Enter some test re
  • Linux内核的TCP源码入门(一)

    文章目录 前言一 TCP报文段结构1 报文段整体结构2 TCP首部 固定部分3 TCP首部 选项 options 二 TCP接收和发送数据1 TCP的 34 接口 34 2 发送数据3 接收数据3 1 ip层向上调用INET Socket层

随机推荐

  • 【API接口工具】postman-Windows版、Linux安装

    Windows安装 Postman 适用于 Windows 7 及更高版本 下载最新的 Postman 版本 选择并运行该 exe文件以安装 Postman Postman v9 4 是 Postman 的最后一个版本 xff0c 同时支持
  • 四轴飞控DIY调试起飞简明步骤

    四轴飞控DIY调试起飞简明步骤 调试起飞简明步骤Step1 xff1a 飞控配置Step2 xff1a 试飞目标测试内容坐标系 Step3 xff1a 试飞方法1 升降 xff08 Throttle xff09 2 偏航 xff08 yaw
  • PX4模块设计之二十七:LandDetector模块

    PX4模块设计之二十七 xff1a LandDetector模块 1 LandDetector模块简介2 模块入口函数2 1 主入口land detector main2 2 自定义子命令custom command 3 LandDetec
  • 穿越机用途和机架尺寸

    穿越机用途和机架尺寸 1 穿越机的用途2 穿越机的机架3 机架的类型3 1 正X型机架3 2 宽X型机架3 3 长X型机架3 4 Hybrid机架3 5 涵道机架 4 总结 1 穿越机的用途 穿越机按功能分 xff0c 主要分为竞速Race
  • 关于穿越机FPV视频果冻效应的讨论

    关于穿越机FPV视频果冻效应的讨论 1 名词定义2 摄像原理2 1 快门分类2 2 常见传感器2 3 卷帘拍摄 3 产生原因4 解决方法4 1 振动出处4 2 软件方法 辅助作用 4 3 硬件方法 直接办法 5 F450试验机FPV视频问题
  • 四轴飞控DIY Mark4 - 减震

    四轴飞控DIY Mark4 减震 1 DIY Mark42 改进事项2 1 Mark4 5 inches机架2 2 2205 2450KV 无刷电机2 3 电机与机架的TPU防震2 4 飞控防震垫圈2 5 三叶平衡桨 3 试飞效果3 1 视
  • Java的压力测试工具之Jmeter

    size 61 large Apache JMeter是Apache组织开发的基于Java的压力测试工具 用于对软件做压力测试 xff0c 它最初被设计用于Web应用测试但后来扩展到其他测试领域 它可以用于测试静态和动态资源例如静态文件 J
  • 四轴飞控DIY Mark4 - 整理&参数优化

    四轴飞控DIY Mark4 整理 amp 参数优化 1 历程2 参数优化2 1 固件BF4 3 12 2 动态怠速值2 3 滤波参数2 4 电调PWM频率2 5 GPS高度配置2 6 返航速度和高度2 7 线性推力修正2 8 图传频道调整
  • ArduPilot开源飞控系统之简单介绍

    ArduPilot开源飞控系统之简单介绍 1 源由2 了解 amp 阅读2 1 ArduPilot历史2 2 关于GPLv32 3 ArduPilot系统组成2 4 ArduPilot代码结构 3 后续3 1 DIY F4503 2 软件设
  • ArduPilot Kakute F7 AIO DIYF450 之GPS配置

    ArduPilot Kakute F7 AIO DIYF450 之GPS配置 1 源由2 步骤2 1 模块预测试2 2 物理连接2 3 UART配置2 4 Compass使能2 5 GPS使能2 6 校准Compass 3 GPS amp
  • ArduPilot之开源代码框架

    ArduPilot之开源代码框架 1 系统框架2 工程框架2 1 工程目录2 2 代码组成2 3 运行流程 4 硬件传感器总线4 1 I2C4 2 SPI4 3 UART4 4 CAN 5 软件设计概念6 总结7 参考资料 在研读ArduP
  • COPY 一种接近最优的导航网格生成算法以及基于导航网格的寻路算法

    提出背景 xff1a 长距离寻路会出现掉帧现象 xff0c 为了提高寻路速度 xff0c 并为3D环境中的寻路方案提供基础算法实现 目前状况 xff1a 由于3D游戏对帧率要求很高 xff0c 而在游戏中进行一次长距离的寻路可能要花费8 1
  • 解析串口-接收完整数据帧

    在linux下编写串口通讯程序 xff0c 采用select监听串口的可读事件 xff0c 一旦可读 xff0c 调用read 但是我们会发现 xff0c read一次得到的数据通常不是完整的一个数据帧 比如完整数据帧为 但是实际上需要re
  • STL 基本容器 优缺点比较

    总结在先 xff1a xff11 如果需要高效的随机存取 xff0c 不在乎插入和删除的效率 xff0c 使用vector xff1b 2 如果需要大量的插入和删除元素 xff0c 不关心随机存取的效率 xff0c 使用list xff1b
  • STL源码剖析--vector容器

    写在前面 vector是我们在STL中最常用的容器 xff0c 我们对它的各种操作也都了然于胸 然而我们在使用vector的时候总会有一种很虚的感觉 xff0c 因为我们不清楚接口内部是如何实现的 在我们眼里宛如一个黑箱 xff0c 既危险
  • TCP/UDP调试工具的使用

    TCP UDP调试工具下载链接 前文 当我们写好一个TCP UDP的程序时 但是无法通信时 光看代码又找不出原因时 我们可以借助调试工具来检查是服务端还是客户端出现了问题 这样就很大的减少了错误的排查范围 再次感叹一下 这个工具真的很好用
  • 关于利用结构体和联合体数据收发的两种方法

    关于利用结构体和联合体数据收发的两种方法 关于最近接手的小项目 xff0c 有了一些经验 xff0c 所以进行一下记录 文章目录 关于利用结构体和联合体数据收发的两种方法前言一 联合体法二 结构体法小tips 前言 在我们利用自己的板子进行
  • RESTful初探之四(Restlets)

    size 61 large Restlets Restlet项目为 建立REST概念与Java类之间的映射 提供了一个轻量级而全面的框架 它可用于实现任何种类的REST式系统 xff0c 而不仅仅是REST式Web服务 color 61 r
  • FreeRTOS中的堆栈设置”与“系统启动文件中堆栈”的关系

    FreeRTOS中的堆栈设置 与 系统启动文件中堆栈 的关系 在STM32CubeMX生成工程时发现 xff0c 在FreeRTOS的配置中同样有TOTAL HEAP SIZE堆的大小配置 xff0c 这个堆与之前系统的堆空间有什么区别呢
  • nodejs 实现http账号密码Digest登录认证

    const http 61 require 39 http 39 const qs 61 require 39 querystring 39 const md5 61 require 39 md5 node 39 第一步 xff1a 获取n