You need to enable JavaScript to run this app.
导航
HTTP 回调鉴权
最近更新时间:2024.08.27 19:16:03首次发布时间:2022.06.15 15:10:53

本文为您介绍 HTTP 回调事件通知的回调机制、鉴权原理及使用流程。

HTTP 回调鉴权原理

视频点播支持在 HTTP/HTTPS 回调时增加特定签名头,以便回调消息接收服务端进行签名认证,用来防止非法或无效请求。HTTP 回调鉴权是否开启由您自行决定,但视频点播建议您开启。如果您在开启了回调鉴权并设置了鉴权密钥,则回调时会携带所有鉴权相关内容,供回调消息接收服务端进行鉴权使用。

鉴权参数

视频点播在回调消息头部增加的具体鉴权参数如下所示。

字段

说明

X-VOD-TIMESTAMP

回调请求发起时间。Unix 时间戳,精度为秒。

X-VOD-SIGNATURE

签名字符串,为 32 位 MD5 值。详细说明请见签名算法

签名算法

X-VOD-SIGNATURE 的计算依赖以下字段:

字段

说明

示例

回调 URL

您在视频点播控制台设置的回调消息接收地址。

https://www.example1.com/your/callback

X-VOD-TIMESTAMP

回调请求发起时间。Unix 时间戳,精度为秒。

1545675780

PrivateKey

您在视频点播控制台设置的鉴权密钥。

ABCDabcd1234

CallbackDataJsonBase64Encode

Base64Encode 处理后的回调数据。

注意

请不要去掉空格。

ewoiYSI6MSwKImIiOjIKfQ==

将上述四个字段按照上述顺序进行拼接,字段中间以竖线(|)分割,然后计算 MD5 值。示例如下所示:

CallbackContent = base64Encode(CallbackDataJson)
MD5Content = 回调URL|X-VOD-TIMESTAMP|PrivateKey|CallbackContent
X-VOD-SIGNATURE = md5sum(MD5Content)

回调消息接收服务端校验流程

  1. 回调消息接收服务端将接收到的回调 JSON 进行 Base64 编码。
  2. 回调消息接收服务端将回调所设置的回调 URL、X-VOD-TIMESTAMP 取值、PrivateKey 取值、Base64Encode 处理后的回调 JSON 拼接后,计算 MD5 值,得到加密字符串,再将加密字符串与回调请求所带的 X-VOD-SIGNATURE 字段进行对比。如果不一致,那么请求是非法的。
  3. (可选)回调消息接收服务端获取当前时间,与回调请求所带的 X-VOD-TIMESTAMP 字段时间相减。如果超过服务端所设定的指定时间(如 8 分钟,由服务端自行定义),则认为该请求无效。

    说明

    由于时间设置等问题,时间差值可能会存在误差,服务端可自行决定是否进行校验。

回调消息接收服务端 Demo

视频点播为您提供 Go、Python、Java、PHP 语言的回调鉴权 Demo。

Go Demo 如下:

func Callback(r *http.Request) {
   timestamp := r.Header.Get("X-VOD-TIMESTAMP")
   // 可以校验 X-VOD-TIMESTAMP 与当前时间,不能超过某个范围
   tm, _ := strconv.ParseInt(timestamp, 10, 64)
   if time.Now().Unix() - tm > consts.MaxRequestTime {
       // 超过某个范围验签不通过
   }
   // 请求 body 进行 base64 编码
   body, _ := io.ReadAll(r.Body)
   callbackContent := base64.StdEncoding.EncodeToString(body)
   // 拼接签算内容,竖线分割,规则为回调 URL|X-VOD-TIMESTAMP|PrivateKey|CallbackContent
   // 因为修改 key 后配置生效有延迟,因此修改 key 时建议兼容两种 key 的配置,这里只给出一个 key 的计算结果
   md5Content := fmt.Sprintf("%s|%s|%s|%s", url, timestamp, privateKey, callbackContent)
   //计算拼接完内容的 md5
   hash := md5.New()
   hash.Write([]byte(md5Content))
   sign := hex.EncodeToString(hash.Sum(nil))
   //判断与 Header:X-VOD-SIGNATURE 是否一致
   if sign == r.Header.Get("X-VOD-SIGNATURE") {
      //todo 验签通过
   } else {
      //todo 验签不通过
   }
}

更换鉴权密钥

您在切换鉴权密钥时,为保证回调鉴权不受影响,您的回调消息接收服务端需要兼容新旧两个 鉴权密钥的平滑切换,即在一段时间内兼容新旧两个鉴权密钥的鉴权。
建议参考以下更换流程:

  1. 您自行定义新的鉴权密钥。
  2. 升级回调消息接收服务端,兼容新旧两个鉴权密钥的鉴权。
  3. 在点播控制台将鉴权密钥更新成最新。
  4. 等待一段时间后,回调消息接收服务端去掉对原来鉴权密钥的兼容。