一、URL‑Token 时效签名防盗链业务场景
做付费点播、直播业务,为了防止 M3U8 播放地址被复制分享出去盗播,最常用的方案就是 URL‑Token 签名防盗链。在 M3U8 访问 URL 后面拼接 token、exp 过期时间等参数。CDN 或者源站收到请求,校验签名是否合法、有没有过期,校验通过才返回资源,校验失败返回 403。
相比 Referer 防盗链,URL‑Token 签名不受 WebView、HTTPS 跳转影响,可靠性更高,是业务优先推荐方案。但是实际开发,新手会踩不少坑:token 过期时间设置不合理、密钥 URI 没有带上 token、Master 多码率子流地址 token 处理、拷贝地址 token 时效过期等。
很多业务踩坑:M3U8 主地址带上 token 可以访问,但是 M3U8 内部写死绝对 URL 的 TS 分片、子 M3U8、AES 密钥地址没有带上 token,分片请求直接 403。
很多新手分不清:token 是附加在主 M3U8 地址上,如果 M3U8 内部分片是写死完整绝对 URL,浏览器请求分片不会自动继承主 url 的 token 参数。遇到 URL‑Token 相关 403 故障,我会使用 m3u8live.cn网页调试工具,打开网络面板,观察 M3U8、TS 分片、密钥完整请求 url 参数,定位哪里缺少 token 签名。
二、URL‑Token 防盗链高频踩坑
坑 1:M3U8 主地址带 token,分片写死绝对 URL,分片不带 token403
现象:访问主 M3U8 地址正常,TS 分片请求 403。 根因:M3U8 文本里面 TS 分片写死完整绝对域名 URL,浏览器请求分片不会复用主 M3U8 的 url 参数。
解决思路:优先源站输出相对路径,分片会自动继承主 url 的 token 参数。如果必须使用绝对 URL,需要改写 M3U8 报文,给每一个分片、子流、密钥地址都拼接 token。
坑 2:AES‑128 加密流,#EXT‑X‑KEY 密钥地址没有携带 token
M3U8、TS 分片 token 拼接正常,但是密钥地址没有带上签名参数,密钥接口返回 403,解密黑屏。密钥也是独立 HTTP 请求,同样要过防盗链校验。
坑 3:token 有效期设置不合理
短视频点播,视频时长 20 分钟,token 只设置 10 分钟有效期,播放中途 token 过期,分片请求 403 黑屏。token 过期时长必须大于视频完整播放最大时长。
坑 4:直播业务,只用一个固定 token 的 M3U8 地址
直播长时间播放,固定 token 会过期。直播场景前端需要在临近过期的时候,重新向业务接口获取新的带 token 播放地址。
坑 5:复制 M3U8 链接给别人调试,token 附带在链接,很快过期失效
开发测试分享流地址的时候,链接带时效 token,没过多久 403,误以为流出问题。测试环境可以提供无 token 的测试地址用于调试。
三、URL‑Token 排查简单流程
第一步,把带 token 的 M3U8 地址粘贴网页调试工具,打开 F12 网络面板。挨个看 M3U8、TS 分片、密钥接口完整请求 URL,观察 token 参数是否存在。
- 如果分片、密钥请求 URL 缺失 token,就是 M3U8 内部分片地址的问题。
第二步,区分 M3U8 内部分片是相对路径还是绝对 URL。相对路径自动继承 url 参数;绝对 URL 不会继承。
第三步,点播业务确认 token 过期时间大于视频总时长;直播业务确认有 token 刷新逻辑。
四、业务开发运维建议
- 优先源站输出相对路径,分片、子流自动继承 URL 上的 token 参数,这是最简单稳定方案。
- AES‑128 加密业务,密钥接口也要带上同样 token 签名,不能遗漏。
- 点播业务 token 过期时间要大于视频总时长,避免播放中途过期 403。
- 直播不能使用固定长期 token,业务层要做 token 临近过期刷新逻辑。
- 测试环境准备不带防盗链 token 的测试流,方便开发测试人员调试,避免分享链接很快过期。
五、总结
URL‑Token 签名防盗链是 M3U8 业务比较可靠的鉴权方案,但是分片写死绝对 URL 的时候,分片、子码率子流、密钥地址不会自动继承主 URL 的 token 参数,很容易出现部分资源 403 黑屏。源站优先输出相对路径,可以规避大部分这类问题。排查的时候借助网页调试工具,观察网络请求完整 url,确认每一路资源是否携带签名 token,快速定位鉴权问题。