אימות בקשות לפלחים של רצפי מודעות

במקרה של שילוב מודעות בצד השרת, הכלי לשינוי מניפסט שולח בקשות לפלחים של רצפי מודעות ל-Google DAI. מידע נוסף זמין במאמר בנושא יצירת כתובות URL של פלחים של מודעות.

בדף הזה מוסבר איך מאמתים בקשות לפלחים של רצפי מודעות באמצעות אסימון HMAC.

לפני שמתחילים

לפני שממשיכים, צריך:

יצירת טוקן HMAC

כדי ליצור אסימון:

  1. אוספים את הנתיב ואת פרמטרים של שאילתה (למעט auth-token) שאוכלסו בבקשה של פלח הפודקאסט. רשימה מלאה זמינה במאמר Method: pod segment.
  2. מאגדים את הפרמטרים למחרוזת אחת. צריך למיין את הפרמטרים לפי סדר אלפביתי ולהפריד ביניהם באמצעות התו tilde‏ ~, לדוגמה:

    custom_asset_key=CUSTOM_ASSET_KEY~exp=EXPIRATION~network_code=NETWORK_CODE~pd=POD_DURATION~pod_id=POD_IDENTIFIER
    
  3. מחשבים גיבוב (hash) SHA-256 של מחרוזת הטוקן באמצעות מפתח האימות של DAI.

  4. תעצב את פלט הגיבוב בפורמט הקסדצימלי.

  5. כדי לחתום על מחרוזת הטוקן, מוסיפים את החתימה בסוף הפרמטרים שנאספו קודם:

    custom_asset_key=...~hmac=HMAC_SIGNATURE
    

    מחליפים את HMAC_SIGNATURE בחתימה שיצרתם על ידי גיבוב של מחרוזת האסימון באמצעות מפתח האימות של DAI.

  6. כדי להעביר את מחרוזת האסימון החתומה בצורה בטוחה, צריך להחיל קידוד URL על מחרוזת האסימון החתומה.

    בדוגמה הבאה נוצר ערך בקידודי תווים שמתאימים לכתובות URL של מחרוזת אסימון חתומה:

HLS

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

echo "Current: $EPOCHSECONDS"
echo "Future: $future_epoch"
# Current: 1774465950
# Future: 1774466010

# Sample DAI pod resource authentication key
key="EB08..."

# Sort parameters in the token string
token="ad_break_id=ab1~custom_asset_key=hls-pod-serving-redirect-auth-stream-pod~exp=1774466010~network_code=21775744923~pd=30000"

# Generate the token's signature.
echo -n $token | openssl dgst -sha256 -mac HMAC -macopt key:$key

# SHA2-256(stdin)= ff38abab31b436351e20ecd57bcc5b97acd9461abb71c4cf9c9731add965ecf2

# Sign the token: ad_break_id=ab1~custom_asset_key=hls-pod-serving-redirect-auth-stream-pod~exp=1774466010~network_code=21775744923~pd=30000~hmac=ff38abab31b436351e20ecd57bcc5b97acd9461abb71c4cf9c9731add965ecf2

# Encode the token: ad_break_id%3Dab1~custom_asset_key%3Dhls-pod-serving-redirect-auth-stream-pod~exp%3D1774466010~network_code%3D21775744923~pd%3D30000~hmac%3Dff38abab31b436351e20ecd57bcc5b97acd9461abb71c4cf9c9731add965ecf2

DASH

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

echo "Current: $EPOCHSECONDS"
echo "Future: $future_epoch"
# Current: 1769540517
# Future: 1769540577

# Sample DAI pod resource authentication key
key="EB08..."

# Sort parameters in the token string
token="ad_break_id=ab1~custom_asset_key=dash-pod-serving-redirect-auth-stream-pod~exp=1774466641~network_code=21775744923~pd=30000"

# Generate the token's signature.
echo -n $token | openssl dgst -sha256 -mac HMAC -macopt key:$key

# SHA2-256(stdin)= 7249f9193778f2318314519ff2cea5c47958bc7fdd2eaf24008352867af0a050

# Sign the token: ad_break_id=ab1~custom_asset_key=dash-pod-serving-redirect-auth-stream-pod~exp=1774466641~network_code=21775744923~pd=30000~hmac=7249f9193778f2318314519ff2cea5c47958bc7fdd2eaf24008352867af0a050

# Encode the token: ad_break_id%3Dab1~custom_asset_key%3Ddash-pod-serving-redirect-auth-stream-pod~exp%3D1774466641~network_code%3D21775744923~pd%3D30000~hmac%3D7249f9193778f2318314519ff2cea5c47958bc7fdd2eaf24008352867af0a050

אימות בקשה לפלח של רצף מודעות בפורמט HLS

כדי לאמת את בקשות המשאבים של ה-Pod, צריך להשתמש בפרמטר auth-token של מחרוזת השאילתה כדי להעביר את אסימון ה-HMAC החתום שמקודד בכתובת ה-URL.

HLS

בדוגמה הבאה נעשה שימוש באסימון HMAC כדי לאמת בקשה של פלח HLS pod:

curl --include "https://dai.google.com/linear/pods/v1/seg/network/21775744923/custom_asset/hls-pod-serving-redirect-auth-stream-pod/ad_break_id/ab1/profile/media-ts-4628000bps/0.ts?stream_id=51b85d28-7ed5-48da-bfd8-e013b7d7b204:DLS&&sd=10000&pd=30000&auth-token=ad_break_id%3Dab1~custom_asset_key%3Dhls-pod-serving-redirect-auth-stream-pod~exp%3D1774466010~network_code%3D21775744923~pd%3D30000~hmac%3Dff38abab31b436351e20ecd57bcc5b97acd9461abb71c4cf9c9731add965ecf2"

אם הפעולה בוצעה ללא שגיאות, התגובה תיראה כך:

...
< HTTP/2 302
< access-control-allow-headers: Authorization
< access-control-allow-origin: *
< access-control-expose-headers: Location
< cache-control: no-cache, no-store, max-age=0, must-revalidate
< date: Wed, 25 Mar 2026 18:13:40 GMT
< expires: Mon, 01 Jan 1990 00:00:00 GMT
< location: https://redirector.googlevideo.com/....
< pragma: no-cache
< x-content-type-options: nosniff
< x-frame-options: SAMEORIGIN
...

כדי להבין את מבנה התגובה ואת קודי הסטטוס, אפשר לעיין במאמר Method: pod segment.

אם האימות נכשל, מוצג x-ad-manager-dai-warning:

...
< HTTP/2 302
< access-control-allow-headers: Authorization
< access-control-allow-origin: *
< access-control-expose-headers: Location
< cache-control: no-cache, no-store, max-age=0, must-revalidate
< date: Wed, 25 Mar 2026 18:17:21 GMT
< expires: Mon, 01 Jan 1990 00:00:00 GMT
< location: https://redirector.googlevideo.com/....
< pragma: no-cache
< x-ad-manager-dai-warning: Unable to create ad break due to Unauthorized error (skipping ad break creation)
< x-content-type-options: nosniff
...

DASH

בדוגמה הבאה נעשה שימוש בטוקן HMAC כדי לאמת בקשה של פלח DASH pod:

curl --include "https://dai.google.com/linear/pods/v1/seg/network/21775744923/custom_asset/dash-pod-serving-redirect-auth-stream-pod/ad_break_id/ab1/profile/media-ts-4628000bps/0.ts?stream_id=8b061ab5-1efc-4e4d-882f-ae3c071df854:ATL&&sd=10000&pd=30000&auth-token=ad_break_id%3Dab1~custom_asset_key%3Ddash-pod-serving-redirect-auth-stream-pod~exp%3D1774466641~network_code%3D21775744923~pd%3D30000~hmac%3D7249f9193778f2318314519ff2cea5c47958bc7fdd2eaf24008352867af0a050"

אם הפעולה בוצעה ללא שגיאות, התגובה תיראה כך:

...
HTTP/2 302
..
location: https://redirector.googlevideo.com/....
...

כדי להבין את מבנה התגובה ואת קודי הסטטוס, אפשר לעיין במאמר Method: pod segment.

אם האימות נכשל, מוצגת השגיאה x-ad-manager-dai-warning באופן הבא:

...
HTTP/2 302
..
location: https://redirector.googlevideo.com/....
pragma: no-cache
x-ad-manager-dai-warning: Unable to create ad break due to Unauthorized error (skipping ad break creation)
x-content-type-options: nosniff
...