במקרה של שילוב מודעות בצד השרת, הכלי לשינוי מניפסט שולח בקשות לפלחים של רצפי מודעות ל-Google DAI. מידע נוסף זמין במאמר בנושא יצירת כתובות URL של פלחים של מודעות.
בדף הזה מוסבר איך מאמתים בקשות לפלחים של רצפי מודעות באמצעות אסימון HMAC.
לפני שמתחילים
לפני שממשיכים, צריך:
- ממלאים את הדרישות המוקדמות.
- חשוב לוודא שמפתחות האימות של משאב ה-Pod מופעלים באירוע השידור החי בחשבון Google Ad Manager.
יצירת טוקן HMAC
כדי ליצור אסימון:
- אוספים את הנתיב ואת פרמטרים של שאילתה (למעט auth-token) שאוכלסו בבקשה של פלח הפודקאסט. רשימה מלאה זמינה במאמר Method: pod segment.
מאגדים את הפרמטרים למחרוזת אחת. צריך למיין את הפרמטרים לפי סדר אלפביתי ולהפריד ביניהם באמצעות התו tilde
~, לדוגמה:custom_asset_key=CUSTOM_ASSET_KEY~exp=EXPIRATION~network_code=NETWORK_CODE~pd=POD_DURATION~pod_id=POD_IDENTIFIERמחשבים גיבוב (hash) SHA-256 של מחרוזת הטוקן באמצעות מפתח האימות של DAI.
תעצב את פלט הגיבוב בפורמט הקסדצימלי.
כדי לחתום על מחרוזת הטוקן, מוסיפים את החתימה בסוף הפרמטרים שנאספו קודם:
custom_asset_key=...~hmac=HMAC_SIGNATUREמחליפים את
HMAC_SIGNATUREבחתימה שיצרתם על ידי גיבוב של מחרוזת האסימון באמצעות מפתח האימות של DAI.כדי להעביר את מחרוזת האסימון החתומה בצורה בטוחה, צריך להחיל קידוד 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
...