You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Express代理中为AXIS摄像头MJPEG流实现服务端HTTP摘要认证

解决方案:服务端代处理HTTP Digest认证,转发MJPEG流

要解决AXIS摄像头的Digest认证问题,核心是让你的代理服务端作为中间层,自动完成与摄像头的Digest认证交互,再将MJPEG流转发给前端,完全规避浏览器的同源限制和认证上下文混乱问题。以下是具体实现方案:

1. 依赖准备

安装专门处理HTTP Digest认证的库digest-fetch,它能自动处理挑战-响应流程:

npm install digest-fetch

2. 修改代理代码

替换原来的http-proxy实现,改用digest-fetch主动发起带认证的请求并转发流:

const express = require('express');
const { DigestClient } = require('digest-fetch');
const app = express();

// 存储摄像头凭证(建议从环境变量/数据库读取,不要硬编码)
const cameraAuthConfig = {
  '192.168.1.72': { username: 'cam-admin', password: 'your-secure-pass' },
  // 其他摄像头的IP-凭证映射
};

app.use('/proxy/:encodedUrl', async (req, res) => {
  try {
    // 解码传入的目标URL
    const targetUrl = decodeURIComponent(req.params.encodedUrl);
    if (!targetUrl) {
      return res.status(406).send('Missing target URL');
    }

    // 解析摄像头IP,匹配对应凭证
    const urlObj = new URL(targetUrl);
    const cameraIp = urlObj.hostname;
    const authCreds = cameraAuthConfig[cameraIp];
    
    if (!authCreds) {
      return res.status(403).send('No valid credentials for this camera');
    }

    // 初始化Digest客户端,自动处理认证流程
    const digestClient = new DigestClient(authCreds.username, authCreds.password, {
      keepAlive: true, // 保持长连接,适配MJPEG流的持续传输
    });

    // 向摄像头发起请求,自动处理Digest挑战
    const cameraResponse = await digestClient.fetch(targetUrl, {
      method: req.method,
      headers: {
        // 转发客户端必要头,替换Host为摄像头的主机名
        ...req.headers,
        Host: urlObj.host,
      },
      signal: req.signal, // 监听客户端断开事件,及时终止摄像头连接
    });

    // 转发摄像头的响应头给客户端
    res.status(cameraResponse.status);
    for (const [headerKey, headerValue] of cameraResponse.headers.entries()) {
      res.setHeader(headerKey, headerValue);
    }

    // 将MJPEG流直接pipe到客户端响应,避免内存占用过高
    cameraResponse.body.pipe(res);
  } catch (error) {
    console.error('Proxy error:', error);
    res.status(500).send('Failed to proxy camera stream');
  }
});

app.listen(80, () => {
  console.log('Remote management proxy running on port 80');
});

3. 方案优势

  • 无客户端感知:前端无需处理任何认证逻辑,体验和匿名访问时完全一致。
  • 规避同源问题:服务端直接与摄像头完成认证交互,浏览器不会涉及跨域认证上下文混乱。
  • 流友好:用pipe方式传输MJPEG流,性能高效,不会缓存大量数据占用内存。
  • 自动处理Digest流程:digest-fetch库会自动处理摄像头返回的401挑战,生成正确的Authorization响应头,无需手动编码认证逻辑。

注意事项

  • 凭证存储要安全:不要硬编码密码,建议用环境变量(如process.env.CAM_192_168_1_72_PASS)或加密数据库存储。
  • 适配多摄像头:可以扩展cameraAuthConfig的匹配逻辑,比如用摄像头的唯一ID而非IP,更灵活。
  • 错误处理:根据实际需求细化错误场景(如摄像头离线、认证失败),返回更精准的提示。

内容的提问来源于stack exchange,提问作者Esben von Buchwald

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 20:14:51