对视频流会话请求进行身份验证

流请求会为直播活动注册会话。 如需了解详情,请参阅发出流请求

本页面介绍了如何使用 HMAC 令牌对流请求进行身份验证。

准备工作

在继续之前,请执行以下操作:

  • 完成前提条件
  • 在您的 Google Ad Manager 账号中,为您的直播活动启用 流创建身份验证密钥。如果您使用令牌身份验证,则必须提供该密钥。

生成 HMAC 令牌

如需生成令牌,请执行以下操作:

  1. 收集直播活动的素材资源键和到期时间。如需了解详情, 请参阅 为创建 DAI 流会话的请求启用身份验证
  2. 按字母顺序对以下参数进行排序,并使用波浪号 ~ 分隔参数:

    event=ASSET_KEY~exp=EXPIRATION
    

    替换以下内容:

    • ASSET_KEY必需 。直播活动的素材资源键。
    • EXPIRATION必需 。令牌的到期时间戳(以 Unix 纪元时间表示)。
  3. 使用您的 DAI 身份验证密钥 计算令牌字符串的 SHA-256 哈希值。

  4. 以十六进制格式设置哈希输出的格式。

  5. 如需对令牌字符串进行签名,请在之前收集的参数末尾附加签名:

    event=...~hmac=HMAC_SIGNATURE
    

    HMAC_SIGNATURE 替换为您通过使用 DAI 身份验证密钥对令牌字符串进行哈希处理而生成的签名。

  6. 如需安全地传递已签名的令牌字符串,请对已签名的令牌字符串应用网址编码。

以下示例对在 60 秒内过期的令牌字符串进行签名和编码:

# Add 60 seconds to the current time
future_epoch=$((EPOCHSECONDS + 60))

echo "Current: $EPOCHSECONDS"
echo "Future: $future_epoch"
# Current: 1767389133
# Future: 1767389193

# Sample DAI stream authentication key
key="DE0E9..."

# Sort parameters in the token string
token="event=YRB0Bl0oQRCb5J-maPpJUQ~exp=1767389193"

# Generate the token's signature.
echo -n $token | openssl dgst -sha256 -mac HMAC -macopt key:$key
# SHA2-256(stdin)= 9935a013957e5ce893a7ee444d3d452fd0de7d273ff8b65471ddd4619b80d248

# Sign the token: event=YRB0Bl0oQRCb5J-maPpJUQ~exp=1767389193~hmac=9935a013957e5ce893a7ee444d3d452fd0de7d273ff8b65471ddd4619b80d248

# Encode the token: event%3DYRB0Bl0oQRCb5J%2DmaPpJUQ%7Eexp%3D1767389193%7Ehmac%3D9935a013957e5ce893a7ee444d3d452fd0de7d273ff8b65471ddd4619b80d248

使用 HMAC 令牌请求直播会话

如需使用 HMAC 令牌对流创建请求进行身份验证,请执行以下其中一项操作:

Authorization 请求标头

  curl "https://dai.google.com/linear/v1/hls/event/YRB0Bl0oQRCb5J-maPpJUQ/stream" \
  -X POST \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -H "Authorization: DCLKDAI token=event%3DYRB0Bl0oQRCb5J%2DmaPpJUQ%7Eexp%3D1767389193%7Ehmac%3D9935a013957e5ce893a7ee444d3d452fd0de7d273ff8b65471ddd4619b80d248"

查询字符串参数

  curl "https://dai.google.com/linear/v1/hls/event/YRB0Bl0oQRCb5J-maPpJUQ/stream?auth-token=event%3DYRB0Bl0oQRCb5J%2DmaPpJUQ%7Eexp%3D1767389193%7Ehmac%3D9935a013957e5ce893a7ee444d3d452fd0de7d273ff8b65471ddd4619b80d248" \
  -X POST \
  -H "Content-Type: application/x-www-form-urlencoded"

表单数据字段

  curl "https://dai.google.com/linear/v1/hls/event/YRB0Bl0oQRCb5J-maPpJUQ/stream" \
  -X POST \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "auth-token=event%3DYRB0Bl0oQRCb5J%2DmaPpJUQ%7Eexp%3D1767389193%7Ehmac%3D9935a013957e5ce893a7ee444d3d452fd0de7d273ff8b65471ddd4619b80d248"

如果成功,您会看到以下 JSON 响应:

  {
  "hls_master_playlist": "https://dai.google.com/linear/hls/pa/event/YRB0Bl0oQRCb5J-maPpJUQ/stream/e91f907e-6a0a-4795-8c96-c8e36e89cbf6:DLS/master.m3u8",
  "media_verification_url": "https://dai.google.com/view/p/service/linear/stream/e91f907e-6a0a-4795-8c96-c8e36e89cbf6:DLS/loc/DLS/network/21775744923/event/YRB0Bl0oQRCb5J-maPpJUQ/media/",
  "metadata_url": "https://dai.google.com/linear/v1/pa/event/YRB0Bl0oQRCb5J-maPpJUQ/stream/e91f907e-6a0a-4795-8c96-c8e36e89cbf6:DLS/metadata",
  "polling_frequency": 10,
  "session_update_url": "https://dai.google.com/linear/v1/pa/event/YRB0Bl0oQRCb5J-maPpJUQ/stream/e91f907e-6a0a-4795-8c96-c8e36e89cbf6:DLS/session",
  "stream_id": "e91f907e-6a0a-4795-8c96-c8e36e89cbf6:DLS",
  "stream_manifest": "https://dai.google.com/linear/hls/pa/event/YRB0Bl0oQRCb5J-maPpJUQ/stream/e91f907e-6a0a-4795-8c96-c8e36e89cbf6:DLS/master.m3u8"
  }

如需了解响应结构和状态代码,请参阅方法:stream。 如果身份验证失败,您会看到以下错误:

  <!DOCTYPE html>
  <html lang=en>
    <meta charset=utf-8>
    <meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width">
    <title>Error 401 (Unauthorized)!!1</title>
    ...
    <a href=//www.google.com/><span id=logo aria-label=Google></span></a>
    <p><b>401.</b> <ins>That’s an error.</ins>
    <p><ins>That’s all we know.</ins>