EdgeOne Token 鉴权全解析:原理、5 种鉴权方式与签名算法

本文整理自 Tencent EdgeOne 官方文档:Token 鉴权 及腾讯云边缘安全加速平台 EO 文档中心,汇总 Token 鉴权的原理、全部 5 种鉴权方式(A / B / C / D / V)的 URL 格式、签名算法与配置示例,方便日常查阅与对接开发。

功能简介

Token 鉴权是一种实现原理简单、可靠性高的访问控制策略,通过配置鉴权规则进行 URL 访问校验,可有效防止站点资源被恶意盗刷。该功能的使用需要客户端和 EdgeOne 配合:客户端发起加密的 URL 请求,EdgeOne 负责根据预先设定的规则对 URL 进行合法性验证。

功能原理

Token 鉴权的实现主要由两部分配合:

  • 客户端:根据鉴权规则(包括鉴权算法、密钥)发起鉴权 URL 的请求;
  • EdgeOne 节点:对鉴权 URL 中的鉴权信息(md5 字符串 + 时间戳)进行校验。校验通过时,该访问请求才会被视为合法请求,节点正常响应;若校验失败,节点拒绝访问,直接返回 403

整个过程即「客户端签名 → 节点验签」:时间戳用于判定请求是否过期,签名串用于判定 URL 是否由持有密钥的合法客户端生成,两者缺一不可。

Token 鉴权 URL 生成和校验工具

EdgeOne 提供了官方的鉴权 URL 生成 / 校验工具,可快速生成符合规则的加密 URL,并校验已有 URL 的签名与过期状态,避免手工计算 MD5/SHA1 出错:

官方工具Token 鉴权 URL 生成 / 校验 在新窗口打开 ↗

提示:若上方内嵌面板未能正常加载,请点击「在新窗口打开」直接使用 EdgeOne 官方工具页面。

鉴权方式总览

EdgeOne Token 鉴权目前支持 5 种鉴权签名计算方式,需根据访问 URL 格式选择合适的方案。四种常见方式(A/B/C/D)面向通用资源,方式 V 为视频场景强化方案。总览对比如下:

方式URL 格式签名算法时间戳格式适用场景
A?token=timestamp-rand-uid-md5hashMD5(Path-timestamp-rand-uid-密钥)十进制 Unix 时间戳通用资源,Query 参数携带签名
B/timestamp/md5hash/FilenameMD5(密钥+timestamp+Path)UTC+8 时间 YYYYMMDDHHMM通用资源,路径前缀携带签名
C/md5hash/timestamp/FilenameMD5(密钥+Path+timestamp)十六进制 Unix 时间戳通用资源,路径前缀携带签名
D?token=md5hash&t=timestampMD5(密钥+Path+timestamp)十进制或十六进制 Unix 时间戳通用资源,Query 参数拆分携带签名
V?t=...&exper=...&us=...&sign=...SHA1(KEY+Path+t+plive+exper+us+whref+bkref+whip+bkip)十六进制小写 Unix 时间戳视频/VOD,支持试看、IP 绑定、伪直播等

所有方式共同的节点校验逻辑:先判断过期(timestamp + 有效时长 与当前时间比较),再比对签名,任一不通过即返回 403。

鉴权方式 A

URL 格式

http://Hostname/Filename?token=timestamp-rand-uid-md5hash
https://Hostname/Filename?token=timestamp-rand-uid-md5hash

token 为自定义的鉴权参数名称。

字段说明

字段说明
Hostname站点加速域名
Path资源访问路径,鉴权时以 / 开头
token自定义设置的鉴权参数名称
timestamp十进制整型正数 Unix 时间戳(UTC 1970-01-01 00:00:00 至今的总秒数,与时区无关)
rand0 - 100 位随机字符串,由大小写字母与数字组成
uid用户 ID,暂未使用,直接设置为 0
md5hash固定长度为 32 位的 MD5 字符串

签名计算方法

md5hash = MD5(Path - timestamp - rand - uid - 密钥)

参数之间以 - 连接后整体做 MD5 运算。

节点校验逻辑

  1. 过期判断:解析 URL 中的 timestamp,加上配置的有效时长,与当前时间比较,超过则判定过期,返回 403;
  2. 签名比对:根据鉴权参数重新计算 md5hash,与 URL 中携带的值比较,一致则鉴权通过,否则返回 403。

配置示例

参数取值
Path/foo.jpg
timestamp1721028437(2024-07-15 15:27:17 UTC+8)
randKv4cPTAAP5YTi
uid0
密钥DvYmqE81E1F9R791H6lmht

拼接签名串并计算:

md5hash = MD5(/foo.jpg-1721028437-Kv4cPTAAP5YTi-0-DvYmqE81E1F9R791H6lmht)
        = 0fbdca749d7ab784750685347e42075c

最终生成的鉴权 URL:

https://www.example.com/foo.jpg?token=1721028437-Kv4cPTAAP5YTi-0-0fbdca749d7ab784750685347e42075c

鉴权方式 B

URL 格式

http://Hostname/timestamp/md5hash/Filename
https://Hostname/timestamp/md5hash/Filename

即在业务真实路径前拼接 /{timestamp}/{md5hash} 两层鉴权前缀。

字段说明

字段说明
Hostname站点加速域名
Path资源访问路径,鉴权时以 / 开头
timestampUTC+8 时间,格式 YYYYMMDDHHMM,例如 201807301000
md5hash固定 32 位字符串,由 MD5 算法计算得出

签名计算方法

md5hash = MD5(密钥 + timestamp + Path)

参数直接拼接(无连接符)。

节点校验逻辑

  1. 过期判断:解析 URL 中的 timestamp,加上有效时长后与当前时间比较,过期则返回 403;
  2. 签名比对:重新计算 md5hash 并与 URL 中携带值比较,一致则通过,否则返回 403;
  3. 剥离前缀回源:鉴权通过后,节点自动剥离 /{timestamp}/{md5hash} 前缀,使用业务真实路径回源。

配置示例

参数取值
Path/foo.jpg
timestamp202407151533(2024-07-15 15:33:50 UTC+8)
密钥DvYmqE81E1F9R791H6lmht
md5hash = MD5(DvYmqE81E1F9R791H6lmht202407151533/foo.jpg)
        = d1f0b51c6894231fc12e054fcc7f0b3e

最终生成的鉴权 URL:

https://www.example.com/202407151533/d1f0b51c6894231fc12e054fcc7f0b3e/foo.jpg

注意:方式 B/C 下,规则引擎的「URL Path」匹配作用于携带鉴权前缀的原始请求路径,而非业务真实路径。因此匹配条件需使用正则匹配,将鉴权前缀一并纳入;不能按业务真实路径(如 URL Path 等于 /foo.jpg)配置,否则请求无法命中规则。

鉴权方式 C

URL 格式

http://Hostname/md5hash/timestamp/Filename
https://Hostname/md5hash/timestamp/Filename

即在资源真实路径前拼接鉴权信息 /{md5hash}/{timestamp}

字段说明

字段说明
Hostname站点加速域名
Path资源访问路径,鉴权时以 / 开头
timestamp十六进制表示的 Unix 时间戳(UTC 1970-01-01 00:00:00 至今总秒数,与时区无关)
md5hash通过 MD5 算法计算出的 32 位字符串

签名计算方法

md5hash = MD5(密钥 + Path + timestamp)

计算时十六进制的 timestamp 需过滤掉进制数标识 0x

节点校验逻辑

  1. 过期判断:解析 URL 中的 timestamp,加上有效时长后与当前时间比较,过期则返回 403;
  2. 签名比对:重新计算 md5hash 并与 URL 中携带值比较;
  3. 剥离前缀回源:鉴权通过后,节点自动剥离 /{md5hash}/{timestamp} 前缀,使用业务真实路径回源。

配置示例

参数取值
Path/foo.jpg
timestamp6694d30a(2024-07-15 15:43:06 UTC+8 的十六进制 Unix 时间戳)
密钥DvYmqE81E1F9R791H6lmht
md5hash = MD5(DvYmqE81E1F9R791H6lmht/foo.jpg6694d30a)
        = 6688749e8906a726c12fe1be3aacd016

最终生成的鉴权 URL:

https://www.example.com/6688749e8906a726c12fe1be3aacd016/6694d30a/foo.jpg

鉴权方式 D

URL 格式

http://Hostname/Filename?token=md5hash&t=timestamp
https://Hostname/Filename?token=md5hash&t=timestamp

tokent 均为自定义设置的鉴权参数名称 / 时间戳参数名称。

字段说明

字段说明
Hostname站点加速域名
Path资源访问路径,鉴权时以 / 开头
token自定义的鉴权参数名称
t自定义的时间戳参数名称
timestampUnix 时间戳,可为十进制或十六进制正整数
md5hashMD5 算法计算出的 32 位字符串

签名计算方法

md5hash = MD5(密钥 + Path + timestamp)

若 timestamp 为十六进制,计算时需过滤掉进制标识 0x

节点校验逻辑

  1. 过期判断:解析 URL 中的 timestamp 参数,加上有效时长后与当前时间比较,过期则返回 403;
  2. 签名比对:根据鉴权参数计算 md5hash 与携带值比较,一致则通过,否则返回 403。

配置示例

参数取值
Path/foo.jpg
timestamp1721029907(2024-07-15 15:51:47 UTC+8)
密钥DvYmqE81E1F9R791H6lmht
md5hash = MD5(DvYmqE81E1F9R791H6lmht/foo.jpg1721029907)
        = cadcec4a04e67b9c2abf4b61c642a0dd

最终生成的鉴权 URL:

https://www.example.com/foo.jpg?token=cadcec4a04e67b9c2abf4b61c642a0dd&t=1721029907

鉴权方式 V(视频场景强化方案)

方式 V 专为强化视频场景权限控制而推出,在基础过期控制之外,额外支持客户端 IP 绑定、试看、Referer 黑白名单、伪直播等能力:

能力说明
过期时间控制URL 中指定过期时间,防止他人长期使用
客户端 IP 绑定将客户端 IP 纳入签名计算,防止他人盗用
试看功能URL 中指定试看时长(exper 参数)
Referer 黑白名单URL 中指定允许 / 禁止来源域名
伪直播指定从某个 Unix 时间戳开始播放视频
防伪造用密钥 KEY 对 URL 签名,密钥不泄露则无法伪造

URL 格式

http://example.vod2.myqcloud.com/dir1/dir2/myVideo.mp4?t=[t]&exper=[exper]&us=[us]&whref=[whref]&whip=[whip]&sign=[sign]

参数说明

参数必选说明
KEY开启方式 V 时填写的密钥,由大小写字母、数字及特殊字符("$ 除外)组成,长度 6 - 40 位
Path原始 URL 的 PATH 部分,如 http://example.vod2.myqcloud.com/dir1/dir2/myVideo.mp4 的 Path 为 /dir1/dir2/myVideo.mp4
t过期时间戳(Unix 时间,秒),以十六进制小写表示。过期后返回 403;实际过期时间比指定时间多 300 秒容差
exper试看时长,十进制秒。不填或填 0 表示不试看(返回完整视频)。试看时长不应超过视频原始时长
us链接标识,用于随机化鉴权 URL,增强唯一性。建议每次生成时指定随机值
plive伪直播参数,Unix 时间十六进制小写,指定从某时间点后才允许播放
whref / bkref允许 / 禁止访问的 Referer 域名列表,1 - 10 条,半角逗号分隔;不带协议名;完整匹配,支持通配符 *.abc.com
whip / bkip允许 / 禁止访问的客户端 IP 列表,1 - 10 个,支持 IP 或 IP 段(如 192.168.0.0/24);IP 通过 X-Forwarded-For 头部获取(多个值时取第一个)
sign防盗链签名,40 个字符十六进制数,校验失败返回 403

补充说明:VOD 源站支持上述全部参数;非 VOD 源站不支持 usplive 参数。对于 m3u8 请求,EdgeOne 会按 ts 路径自行生成鉴权参数并改写 ts URL,客户端只需生成 m3u8 的鉴权 URL。

签名计算方法

sign = SHA1(KEY + Path + t + plive + exper + us + whref + bkref + whip + bkip)

+ 代表字符串拼接,选填参数可为空字符串;参数顺序必须严格按上述公式顺序,否则生成错误签名。

配置示例

基础参数:原始 URL http://example.vod2.myqcloud.com/dir1/dir2/myVideo.mp4,KEY = 24FEQmTzro4V5u3D5epW,随机串 us = 72d4cd1101,过期时间 2018-01-31 20:00(Unix 时间 1517400000,十六进制 5a71afc0)。

示例 1:播放地址有效时间控制

sign = SHA1(24FEQmTzro4V5u3D5epW/dir1/dir2/myVideo.mp45a71afc072d4cd1101)
     = 3ff5ab708b018fce5c3023b6d27ca938d7ab75e3
http://example.vod2.myqcloud.com/dir1/dir2/myVideo.mp4?t=5a71afc0&us=72d4cd1101&sign=3ff5ab708b018fce5c3023b6d27ca938d7ab75e3

示例 2:同一鉴权 URL 仅允许一个客户端 IP 访问(在示例 1 基础上增加 whip=192.168.0.0

sign = SHA1(24FEQmTzro4V5u3D5epW/dir1/dir2/myVideo.mp45a71afc0724cd1101192.168.0.0)
     = c8cd894ef4ee0387c99ac488f46bbe8205bc63af
http://example.vod2.myqcloud.com/dir1/dir2/myVideo.mp4?t=5a71afc0&us=72d4cd1101&whip=192.168.0.0&sign=c8cd894ef4ee0387c99ac488f46bbe8205bc63af

示例 3:允许播放时长控制(试看 5 分钟)(在示例 1 基础上增加 exper=300

sign = SHA1(24FEQmTzro4V5u3D5epW/dir1/dir2/myVideo.mp45a71afc030072d4cd1101)
     = 3a50217aff3e39fbf795b8db40925bc61735fe83
http://example.vod2.myqcloud.com/dir1/dir2/myVideo.mp4?t=5a71afc0&exper=300&us=72d4cd1101&sign=3a50217aff3e39fbf795b8db40925bc61735fe83

控制台配置步骤

  1. 登录边缘安全加速平台 EO 控制台,在左侧菜单栏进入服务总览,单击网站安全加速内需配置的站点;
  2. 在站点详情页单击站点加速,进入站点全局配置页面,单击规则引擎 Tab;
  3. 在规则引擎管理页面单击创建规则,选择新增空白规则
  4. 在规则编辑页面设置触发该规则的匹配条件;
  5. 单击操作 > 选择框,在操作列表内选择Token 鉴权,参数配置说明如下:
配置项说明
鉴权方式目前支持 5 种鉴权签名计算方式,根据访问 URL 格式选择(A / B / C / D / V)
主鉴权密钥(必选)主用密码,由 6 - 40 位大小写英文字母、数字及特殊字符("$ 除外)组成
备鉴权密钥(可选)备用密码,规则同主鉴权密钥,用于密钥轮换
鉴权加密串参数名称鉴权参数名称,节点将校验此参数名对应的值,由 1 - 100 位大小写字母、数字或下划线组成
有效时长鉴权 URL 有效时长,单位秒(1 - 630720000)。当前时间超过 timestamp + 有效时长 则为过期请求,直接返回 403;未过期则继续校验签名

注意事项

  1. 鉴权通过后,节点会自动忽略 URL 中鉴权相关的参数进行缓存,从而提高缓存命中率、减少回源量;
  2. URL 中不能包含中文,若含中文需提前编码转换;
  3. 密钥需严格保密,仅客户端与服务端知晓,建议定期轮换(配置备鉴权密钥可平滑过渡);
  4. 鉴权 URL 均包含时间戳,需保证客户端与服务端时钟同步,并配置合理有效时长(方式 V 内置 300 秒容差)。

参考资料