视频点播提供 Referer 黑白名单、IP 黑白名单等功能对访客进行过滤。但是在某些情况下,Referer 和 IP 可以被伪造,容易造成站点资源被恶意盗用。如果您对于站点内容的安全性有很高的要求,可以采用 URL 鉴权。本文为您介绍如何在视频点播控制台开启和配置 URL 鉴权。
下图展示了视频点播 URL 鉴权的整体流程:
具体步骤说明如下:
在这个流程中,应用客户端负责发起请求,应用服务端负责生成鉴权 URL,CDN 节点负责接收请求并进行鉴权信息的校验。鉴权信息的生成和校验依赖于共享的密钥和鉴权算法,确保了请求的合法性和安全性。通过这种方式,您可以有效地保护 CDN 资源免受未经授权的访问。
URL 鉴权适用于点播加速域名和自定义源站加速域名。其中:
按照以下步骤为点播加速域名开启并配置 A 类型的 URL 鉴权:
登录视频点播控制台,进入指定空间。
单击左侧导航栏分发加速设置 > 域名管理。
单击点播加速域名页签,单击操作列的配置按钮。
在点播加速域名配置页面,单击访问控制页签。
单击页面下方修改配置按钮。
在 URL 鉴权区域,开启并配置 URL 鉴权功能。
详细的参数信息如下表所示。
参数 | 说明 |
---|---|
类型 | A 类型 |
生效对象 | 表示对哪些文件的请求需要被鉴权。您至少需要添加一个规则,最多可以添加 10 个。
每条规则包含以下配置:
|
签名主 Key | 主密钥。支持通过以下两种方式设置签名主 Key:
|
签名备 Key | 备密钥。支持通过以下两种方式设置签名备 Key:
说明 对线上业务域名变更 URL 鉴权时,建议在过渡期使用备 Key,避免业务中断。 |
签名参数 | 固定为 auth_key。 |
时间格式 | 固定为十进制(Unix 时间戳)。 |
m3u8 改写 | 表示在响应
说明
|
注意
对于点播加速域名的 A 类型 URL 鉴权,不支持在控制台设置有效时长。点播加速域名 A 类型的签名计算规则,请见签名计算。
按照以下步骤为自定义源站加速域名开启并配置 URL 鉴权:
时间戳防盗链功能决定了通过 GetPlayInfo 接口从视频点播服务获取到的视频播放地址的有效时长。URL 鉴权功能中设置的有效时长决定的则是视频点播 CDN 服务生成的 URL 的有效时长。
如果您同时配置了时间戳防盗链和URL鉴权,那么会存在以下两种情况:
为方便您快速进行签名计算,视频点播提供了多种语言的签名 Demo,演示如何根据给定的密钥和其他参数,生成不同类型的带签名的 URL。
package main import ( "crypto/md5" "encoding/hex" "fmt" "math/rand" "regexp" "strconv" "time" ) func splitUrl(url string) []string { reg := regexp.MustCompile("^(http://|https://)?([^/?]+)(/[^?]*)?(\\?.*)?$") return reg.FindStringSubmatch(url) } func getMd5(text string) string { hashByte := md5.Sum([]byte(text)) return hex.EncodeToString(hashByte[:]) } func getRandomString(length int) string { b := make([]byte, length) rand.Read(b) return fmt.Sprintf("%x", b)[:length] } func GenTypeAUrl(url string, key string, signName string, uid string, ts int64) string { params := splitUrl(url) scheme, host, path, args := params[1], params[2], params[3], params[4] randstr := getRandomString(10) text := fmt.Sprintf("%s-%d-%s-%s-%s", path, ts, randstr, uid, key) hash := getMd5(text) authArg := fmt.Sprintf("%s=%d-%s-%s-%s", signName, ts, randstr, uid, hash) if args == "" { return fmt.Sprintf("%s%s%s?%s", scheme, host, path, authArg) } else { return fmt.Sprintf("%s%s%s%s&%s", scheme, host, path, args, authArg) } } func GenTypeBUrl(url string, key string, ts int64) string { params := splitUrl(url) scheme, host, path, args := params[1], params[2], params[3], params[4] tsStr := time.Unix(ts, 0).Format("200601021504") text := fmt.Sprintf("%s%s%s", key, tsStr, path) hash := getMd5(text) return fmt.Sprintf("%s%s/%s/%s%s%s", scheme, host, tsStr, hash, path, args) } func GenTypeCUrl(url string, key string, ts int64) string { params := splitUrl(url) scheme, host, path, args := params[1], params[2], params[3], params[4] tsStr := strconv.FormatInt(ts, 16) text := fmt.Sprintf("%s%s%s", key, path, tsStr) hash := getMd5(text) return fmt.Sprintf("%s%s/%s/%s%s%s", scheme, host, hash, tsStr, path, args) } func GenTypeDUrl(url, key, signName, timeName string, ts int64, base int) string { params := splitUrl(url) scheme, host, path, args := params[1], params[2], params[3], params[4] tsStr := strconv.FormatInt(ts, base) text := fmt.Sprintf("%s%s%s", key, path, tsStr) hash := getMd5(text) authArg := fmt.Sprintf("%s=%s&%s=%s", signName, hash, timeName, tsStr) if args == "" { return fmt.Sprintf("%s%s%s?%s", scheme, host, path, authArg) } else { return fmt.Sprintf("%s%s%s%s&%s", scheme, host, path, args, authArg) } } // GenTypeEUrl Genrate signed url by custom rule(eg.:key+domain+uri+timestamp) func GenTypeEUrl(url, key, signName, tsName string, ts int64, base int) string { params := splitUrl(url) scheme, domain, uri, args := params[1], params[2], params[3], params[4] tsStr := strconv.FormatInt(ts, base) text := fmt.Sprintf("%s%s%s%s", key, domain, uri, tsStr) hash := getMd5(text) authArg := fmt.Sprintf("%s=%s&%s=%s", signName, hash, tsName, tsStr) if args == "" { return fmt.Sprintf("%s%s%s?%s", scheme, domain, uri, authArg) } else { return fmt.Sprintf("%s%s%s%s&%s", scheme, domain, uri, args, authArg) } } func init() { rand.Seed(time.Now().UnixNano()) } func main() { var url = "http://www.test.com/a.txt?a=b&c=d" var primaryKey = "primary123456" var signName = "auth_key" var timeName = "t" var uid = "0" var ts = time.Now().Unix() + 3600 //默认一小时过期 typeAUrl := GenTypeAUrl(url, primaryKey, signName, uid, ts) typeBUrl := GenTypeBUrl(url, primaryKey, ts) typeCUrl := GenTypeCUrl(url, primaryKey, ts) typeDUrl := GenTypeDUrl(url, primaryKey, signName, timeName, ts, 10) typeEUrl := GenTypeEUrl(url, primaryKey, signName, timeName, ts, 10) fmt.Println("OriginUrl: ", url) fmt.Println("TypeA: ", typeAUrl) fmt.Println("TypeB: ", typeBUrl) fmt.Println("TypeC: ", typeCUrl) fmt.Println("TypeD: ", typeDUrl) fmt.Println("TypeE: ", typeEUrl) }