스트림 세션 요청 인증

스트림 요청은 라이브 스트림 이벤트의 세션을 등록합니다. 자세한 내용은 스트림 요청하기를 참고하세요.

이 페이지에서는 HMAC 토큰을 사용하여 스트림 요청을 인증하는 방법을 설명합니다.

시작하기 전에

계속하기 전에 다음을 수행하세요.

  • 기본 요건을 완료합니다.
  • Google Ad Manager 계정에서 라이브 스트림 이벤트에 대해 스트림 생성 인증 키를 사용 설정합니다. 토큰 인증을 사용하는 경우 키가 필요합니다.

HMAC 토큰 생성

토큰을 생성하려면 다음을 실행하세요.

  1. 라이브 스트림의 애셋 키와 만료 시간을 수집합니다. 자세한 내용은 DAI 스트림 세션 생성 요청에 대한 인증 사용 설정을 참고하세요.
  2. 다음 매개변수를 알파벳순으로 정렬하고 틸드 ~ 문자로 매개변수를 구분합니다.

    event=ASSET_KEY~exp=EXPIRATION
    

    다음을 바꿉니다.

    • ASSET_KEY: 필수. 라이브 스트림 이벤트의 애셋 키입니다.
    • EXPIRATION: 필수. 토큰의 만료 타임스탬프입니다(유닉스 시간).
  3. DAI 인증 키를 사용하여 토큰 문자열의 SHA-256 해시를 계산합니다.

  4. 해시 출력을 16진수로 형식 지정합니다.

  5. 토큰 문자열에 서명하려면 이전에 수집한 매개변수 끝에 서명을 추가합니다.

    event=...~hmac=HMAC_SIGNATURE
    

    HMAC_SIGNATURE을 DAI 인증 키를 사용하여 토큰 문자열을 해싱하여 생성한 서명으로 바꿉니다.

  6. 서명된 토큰 문자열을 안전하게 전달하려면 서명된 토큰 문자열에 URL 인코딩을 적용하세요.

다음 예에서는 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"
  }

응답 구조와 상태 코드를 이해하려면 메서드: 스트림을 참고하세요. 인증이 실패하면 다음과 같은 오류가 표시됩니다.

  <!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>