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 出错:
鉴权方式总览
EdgeOne Token 鉴权目前支持 5 种鉴权签名计算方式,需根据访问 URL 格式选择合适的方案。四种常见方式(A/B/C/D)面向通用资源,方式 V 为视频场景强化方案。总览对比如下:
| 方式 | URL 格式 | 签名算法 | 时间戳格式 | 适用场景 |
|---|---|---|---|---|
| A | ?token=timestamp-rand-uid-md5hash | MD5(Path-timestamp-rand-uid-密钥) | 十进制 Unix 时间戳 | 通用资源,Query 参数携带签名 |
| B | /timestamp/md5hash/Filename | MD5(密钥+timestamp+Path) | UTC+8 时间 YYYYMMDDHHMM | 通用资源,路径前缀携带签名 |
| C | /md5hash/timestamp/Filename | MD5(密钥+Path+timestamp) | 十六进制 Unix 时间戳 | 通用资源,路径前缀携带签名 |
| D | ?token=md5hash&t=timestamp | MD5(密钥+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 至今的总秒数,与时区无关) |
| rand | 0 - 100 位随机字符串,由大小写字母与数字组成 |
| uid | 用户 ID,暂未使用,直接设置为 0 |
| md5hash | 固定长度为 32 位的 MD5 字符串 |
签名计算方法
md5hash = MD5(Path - timestamp - rand - uid - 密钥)
参数之间以 - 连接后整体做 MD5 运算。
节点校验逻辑
- 过期判断:解析 URL 中的
timestamp,加上配置的有效时长,与当前时间比较,超过则判定过期,返回 403; - 签名比对:根据鉴权参数重新计算
md5hash,与 URL 中携带的值比较,一致则鉴权通过,否则返回 403。
配置示例
| 参数 | 取值 |
|---|---|
| Path | /foo.jpg |
| timestamp | 1721028437(2024-07-15 15:27:17 UTC+8) |
| rand | Kv4cPTAAP5YTi |
| uid | 0 |
| 密钥 | 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 | 资源访问路径,鉴权时以 / 开头 |
| timestamp | UTC+8 时间,格式 YYYYMMDDHHMM,例如 201807301000 |
| md5hash | 固定 32 位字符串,由 MD5 算法计算得出 |
签名计算方法
md5hash = MD5(密钥 + timestamp + Path)
参数直接拼接(无连接符)。
节点校验逻辑
- 过期判断:解析 URL 中的
timestamp,加上有效时长后与当前时间比较,过期则返回 403; - 签名比对:重新计算
md5hash并与 URL 中携带值比较,一致则通过,否则返回 403; - 剥离前缀回源:鉴权通过后,节点自动剥离
/{timestamp}/{md5hash}前缀,使用业务真实路径回源。
配置示例
| 参数 | 取值 |
|---|---|
| Path | /foo.jpg |
| timestamp | 202407151533(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。
节点校验逻辑
- 过期判断:解析 URL 中的
timestamp,加上有效时长后与当前时间比较,过期则返回 403; - 签名比对:重新计算
md5hash并与 URL 中携带值比较; - 剥离前缀回源:鉴权通过后,节点自动剥离
/{md5hash}/{timestamp}前缀,使用业务真实路径回源。
配置示例
| 参数 | 取值 |
|---|---|
| Path | /foo.jpg |
| timestamp | 6694d30a(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
token 与 t 均为自定义设置的鉴权参数名称 / 时间戳参数名称。
字段说明
| 字段 | 说明 |
|---|---|
| Hostname | 站点加速域名 |
| Path | 资源访问路径,鉴权时以 / 开头 |
| token | 自定义的鉴权参数名称 |
| t | 自定义的时间戳参数名称 |
| timestamp | Unix 时间戳,可为十进制或十六进制正整数 |
| md5hash | MD5 算法计算出的 32 位字符串 |
签名计算方法
md5hash = MD5(密钥 + Path + timestamp)
若 timestamp 为十六进制,计算时需过滤掉进制标识 0x。
节点校验逻辑
- 过期判断:解析 URL 中的
timestamp参数,加上有效时长后与当前时间比较,过期则返回 403; - 签名比对:根据鉴权参数计算
md5hash与携带值比较,一致则通过,否则返回 403。
配置示例
| 参数 | 取值 |
|---|---|
| Path | /foo.jpg |
| timestamp | 1721029907(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 源站不支持
us、plive参数。对于 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
控制台配置步骤
- 登录边缘安全加速平台 EO 控制台,在左侧菜单栏进入服务总览,单击网站安全加速内需配置的站点;
- 在站点详情页单击站点加速,进入站点全局配置页面,单击规则引擎 Tab;
- 在规则引擎管理页面单击创建规则,选择新增空白规则;
- 在规则编辑页面设置触发该规则的匹配条件;
- 单击操作 > 选择框,在操作列表内选择Token 鉴权,参数配置说明如下:
| 配置项 | 说明 |
|---|---|
| 鉴权方式 | 目前支持 5 种鉴权签名计算方式,根据访问 URL 格式选择(A / B / C / D / V) |
| 主鉴权密钥(必选) | 主用密码,由 6 - 40 位大小写英文字母、数字及特殊字符(" 和 $ 除外)组成 |
| 备鉴权密钥(可选) | 备用密码,规则同主鉴权密钥,用于密钥轮换 |
| 鉴权加密串参数名称 | 鉴权参数名称,节点将校验此参数名对应的值,由 1 - 100 位大小写字母、数字或下划线组成 |
| 有效时长 | 鉴权 URL 有效时长,单位秒(1 - 630720000)。当前时间超过 timestamp + 有效时长 则为过期请求,直接返回 403;未过期则继续校验签名 |
注意事项
- 鉴权通过后,节点会自动忽略 URL 中鉴权相关的参数进行缓存,从而提高缓存命中率、减少回源量;
- URL 中不能包含中文,若含中文需提前编码转换;
- 密钥需严格保密,仅客户端与服务端知晓,建议定期轮换(配置备鉴权密钥可平滑过渡);
- 鉴权 URL 均包含时间戳,需保证客户端与服务端时钟同步,并配置合理有效时长(方式 V 内置 300 秒容差)。