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

基于NodeJS搭建Widevine许可证代理服务器遇403错误如何解决

Shaka Player DRM许可证代理403错误排查与修复方案

核心问题诱因(按出现概率排序)

  • Express未正确解析二进制请求体
    默认的express.json()、express.urlencoded()解析器会破坏DRM许可证挑战的二进制格式,首次2字节请求因结构简单未触发异常,第二次完整二进制请求被解析后内容篡改,导致原服务校验失败返回403。
    修复方式:为许可证请求路由单独配置raw解析器,示例配置:
    // 仅对许可证路由启用二进制解析,优先级高于全局解析器
    app.post('/license/:contentId', express.raw({ type: '*/*', limit: '2mb' }), async (req, res) => {
      // 路由逻辑
    })
    
  • Header透传规则错误
    原许可证服务通常会校验Host、Content-Type、DRM自定义头等字段,常见错误包括:透传了代理服务的Host头而非原许可证服务的Host、axios自动覆盖了二进制请求的Content-Type、遗漏了Authorization/Origin等校验头,导致原服务鉴权失败。
    修复方式:过滤无效头后再透传,示例代码:
    const proxyHeaders = { ...req.headers };
    // 删除不需要透传的头
    delete proxyHeaders.host;
    delete proxyHeaders['content-length']; // 由axios自动计算正确的body长度
    delete proxyHeaders['accept-encoding'];
    // 手动设置原服务要求的头
    proxyHeaders.host = new URL(ORIGIN_LICENSE_URL).host;
    
  • axios响应类型配置错误
    未指定responseType: 'arraybuffer'时,axios会将二进制许可证响应自动转为字符串,返回给Shaka Player时内容损坏,也可能触发二次请求校验失败。
  • 参数拼接逻辑错误
    需确认两次请求的contentId参数都正确拼接至原许可证服务的请求地址,不存在第二次请求参数丢失、拼接错误的问题。

完整可运行代理代码示例

const express = require('express');
const axios = require('axios');
const app = express();

// 替换为你的原始许可证服务地址
const ORIGIN_LICENSE_URL = 'https://原许可证服务地址/license';

// 许可证代理路由
app.post('/license/:contentId', express.raw({ type: '*/*', limit: '2mb' }), async (req, res) => {
  try {
    const proxyHeaders = { ...req.headers };
    delete proxyHeaders.host;
    delete proxyHeaders['content-length'];
    delete proxyHeaders['accept-encoding'];
    proxyHeaders.host = new URL(ORIGIN_LICENSE_URL).host;

    const licenseResp = await axios({
      method: 'POST',
      url: `${ORIGIN_LICENSE_URL}?contentId=${req.params.contentId}`, // 按原服务要求调整参数拼接方式
      data: req.body,
      headers: proxyHeaders,
      responseType: 'arraybuffer',
      maxRedirects: 5
    });

    // 透传原服务所有响应头
    Object.entries(licenseResp.headers).forEach(([key, value]) => {
      res.setHeader(key, value);
    });

    res.status(licenseResp.status).send(licenseResp.data);
  } catch (err) {
    console.error('代理错误详情:', err.response?.status || err.message, err.response?.data);
    res.status(err.response?.status || 500).send(err.response?.data || 'Proxy Error');
  }
});

app.listen(3000, () => console.log('代理服务运行在端口3000'));

内容的提问来源于stack exchange,提问作者Rohan Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 14:36:02