Use dual-token authentication

To enforce dual-token authentication when viewers access a streaming resource, you configure separate routes . A route is a configuration that matches requests for Media CDN and directs HTTP traffic to an origin. Media CDN supports routes for either HTTP live streaming (HLS) or Dynamic Adaptive Streaming over HTTP (DASH) resources. For more information about routes in Media CDN, see Configure service routes .

For HLS streams, Media CDN supports dual-token authentication through cookies and URL query parameters (cookieless). For DASH streams, Media CDN supports only cookie-based dual-token authentication.

This page describes how to configure Media CDN routes to help protect content by using dual-token authentication.

Before you begin

Do the following:

  1. For short-duration tokens, choose one of the following signature algorithms:

    • Ed25519 signatures
    • Symmetric-key hash-based message authentication codes (HMACs)

    You can enable symmetric HMAC signing algorithms only for routes configured to generate new long-duration tokens. We recommend that you use Ed25519 signatures for optimal performance and security and symmetric-key HMACs only when necessary for compatibility with other CDNs.

  2. Include the required keys in an EdgeCacheKeyset resource .

    Tokens must be signed or verified with keys in an EdgeCacheKeyset resource. The keyset must include the correct keys for the selected signature algorithm. The following table describes each of the signature algorithms and their required keys.

    Signature algorithm Required keys in the keyset
    Ed25519 Public keys
    HMAC-SHA1 Validation shared keys
    HMAC-SHA256 Validation shared keys

    As a best practice, make two separate keysets, one for short-duration tokens and another for long-duration tokens.

    However, if you're using DASH and dynamic media presentation description (MPD) files, you must use the same keyset for both long-duration and short-duration tokens.

  3. For long-duration tokens, choose one of the following token formats:

    • Cookies
    • URL query parameters

Set up short-duration tokens

Depending on the signature algorithm that you want to use, set up short-duration tokens by using one of the following options.

Ed25519 signature

  1. Generate a private key:

     openssl genpkey -algorithm ed25519 -outform PEM -out SSL_KEY_NAME 
    .private.key 
    

    Replace SSL_KEY_NAME with a key name.

  2. Generate a public key from the private key:

     openssl pkey -outform DER -pubout -in SSL_KEY_NAME 
    .private.key |\
    tail -c +13 |\
    python3 -c "import base64, sys; print(('%s' % base64.urlsafe_b64encode(sys.stdin.buffer.read()))[2:-1])" 
    
  3. Create a new keyset with a single public key:

    Console

    1. In the Google Cloud console, go to the Media CDNpage.

      Go to Media CDN

    2. Click the Keysetstab.

    3. Click Create keyset.

    4. For Name, enter a unique keyset name.

    5. Optional: For Description, enter a description for your keyset.

    6. Optional: Click Add label, and then enter one or more key-value pairs for your keyset.

    7. Click Add public key, and then do the following:

      1. For ID, enter an alphanumeric ID.
      2. Select Enter the value, and then specify the base64-encoded value of your Ed25519 public key.
    8. Click Create keyset.

    gcloud

    Use the gcloud edge-cache keysets create command .

    gcloud edge-cache keysets create SHORT_KEYSET_NAME 
    \
      --public-key='id= SSL_PUBLIC_KEY_NAME 
    ,value= SSL_PUBLIC_KEY_VALUE 
    '

    Replace the following:

    • SHORT_KEYSET_NAME : a unique keyset name—for example, prod-vod-keyset
    • SSL_PUBLIC_KEY_NAME : the name of your SSL public key
    • SSL_PUBLIC_KEY_VALUE : the value of your SSL public key

    To review the keys associated with the keyset, use the gcloud edge-cache keysets describe command .

    gcloud edge-cache keysets describe prod-vod-keyset

    The output is similar to the following:

    name: prod-vod-keyset
    description: "Keyset for prod.example.com"
    publicKeys:
    - id: "key-20200918"
      value: "DThVLjhAKm3VYOvLBAwFZ5XbjVyF98Ias8NZU0WEM9w"
    - id: "key-20200808"
      value: "Lw7LDSaDUrbDdqpPA6JEmMF5BA5GPtd7sAjvsnh7uDA="

    Terraform

     resource "google_network_services_edge_cache_keyset" "default" {
      name        = "prod-vod-keyset"
      description = "Keyset for prod.example.com"
      public_key {
        id    = "key-20200918"
        value = "FHsTyFHNmvNpw4o7-rp-M1yqMyBF8vXSBRkZtkQ0RKY" # Update Ed25519 public key
      }
      public_key {
        id    = "key-20200808"
        value = "Lw7LDSaDUrbDdqpPA6JEmMF5BA5GPtd7sAjvsnh7uDA=" # Update Ed25519 public key
      }
    } 
    

Symmetric-key HMAC

  1. If you haven't used Secret Manager before, configure Secret Manager .

  2. Create a secret .

  3. Add a secret version in binary format.

  4. Grant the Secret Manager Access role ( roles/secretmanager.secretAccessor ) to the Media CDN service account:

    Console

    1. In the Google Cloud console, go to the Secret Managerpage.

      Go to Secret Manager

    2. Select the checkbox next to the name of the secret.

    3. Click Show Info Panel.

    4. In the info panel, click Add principal.

    5. For New principals, enter the Media CDN service account in this format:

      service- PROJECT_NUMBER 
      @gcp-sa-mediaedgefill.iam.gserviceaccount.com

      Replace PROJECT_NUMBER with your project number.

    6. For Select a role, select Secret Manager, and then select Secret Manager Secret Accessor.

    gcloud

    Use the gcloud secrets add-iam-policy-binding command .

    gcloud secrets add-iam-policy-binding projects/ PROJECT_NUMBER 
    /secrets/ SECRET_ID 
    \
      --member="serviceAccount:service- PROJECT_NUMBER 
    @gcp-sa-mediaedgefill.iam.gserviceaccount.com" \
      --role="roles/secretmanager.secretAccessor"

    Replace the following:

    • PROJECT_NUMBER : your project number
    • SECRET_ID : the ID of the secret
  5. Access your secret versions and copy the secret paths, including version numbers.

  6. Create a new keyset with the shared secrets in a validation shared key:

    Console

    1. In the Google Cloud console, go to the Media CDNpage.

      Go to Media CDN

    2. Click the Keysetstab.

    3. Click Create keyset.

    4. For Name, enter a unique keyset name.

    5. Optional: For Description, enter a description for your keyset.

    6. Optional: Click Add label, and then enter one or more key-value pairs for your keyset.

    7. To specify a validation shared key, click Add validation shared key, and then do the following:

      1. For Secret, select a secret from the list, enter a secret manually by specifying its resource ID, or create a new secret and then select it.

      2. For Secret version, select a version from the list or create a new secret version and then select it.

    8. Click Create keyset.

    gcloud

    Use the gcloud edge-cache keysets create command .

    gcloud edge-cache keysets create SHORT_KEYSET_NAME 
    \
      --validation-shared-key='secret_version=projects/ PROJECT_NUMBER 
    /secrets/ SECRET_ID 
    /versions/ KEY_VERSION 
    '

    Replace the following:

    • SHORT_KEYSET_NAME : a unique name for the keyset—for example, prod-vod-keyset
    • PROJECT_NUMBER : your project ID
    • SECRET_ID : the resource ID of the secret
    • KEY_VERSION : the secret version that you want to use

Set up long-duration tokens

Google-owned and managed keys are scoped by keyset. That means that two different keysets have different Google-owned and managed keys. Google-owned and managed keys are rotated regularly.

Set up long-duration tokens by using one of the following options:

Console

  1. Create or modify a keyset .

  2. In the Keyssection, select Use Google-owned and managed key for dual-token authentication.

gcloud and YAML

Use either of the following options:

  • Create a Google-managed signing key:

     gcloud edge-cache keysets create LONG_KEYSET_NAME 
    \
        --public-key='id=google-managed-key,managed=true' 
    

    Replace LONG_KEYSET_NAME with a key name—for example, prod-vod-keyset-long .

  • Modify an existing keyset:

    1. Export your keyset to a YAML file. Use the gcloud edge-cache keysets export command .

        gcloud 
        
       edge 
       - 
       cache 
        
       keysets 
        
       export 
        
        LONG_KEYSET_NAME 
       
        
      \  
       -- 
       destination 
       = 
       prod 
       - 
       vod 
       - 
       keyset 
       - 
       long 
       . 
       yaml 
       
      
    2. In a text editor or in your configuration management tooling, edit your keyset configuration so that it looks similar to the following:

        name 
       : 
        
       projects/my-project/locations/global/edgeCacheKeysets/ LONG_KEYSET_NAME 
       
       publicKeys 
       : 
       - 
        
       id 
       : 
        
       some-key 
        
       value 
       : 
        
       MC4CAQAwBQYDK2VwBCIEINV2iYugIWBuvGBJUQ_Ab69E4v4zcVqvgYHw-iZxGzcd 
       - 
        
       id 
       : 
        
       google-managed-key 
        
       managed 
       : 
        
       true 
       
      
    3. Import the edited keyset. Use the gcloud edge-cache keysets import command :

        gcloud 
       edge 
       - 
       cache 
       keysets 
       import 
        
        LONG_KEYSET_NAME 
       
      \ -- 
       source 
       = 
       prod 
       - 
       vod 
       - 
       keyset 
       - 
       long 
       . 
       yaml 
       
      

You can include additional public keys in the long-duration token keyset. The keyset may have at most three public keys. In practice, this means that the keyset can have two user-managed keys and one Google-owned and managed key.

Media CDN always uses the Google-owned and managed key to generate tokens. The user-managed keys can be used only for verification.

Including additional public keys is useful to let your player application access media playlists and media segments by using signed requests that are generated by your own private keys.

Configure token exchange

This section shows how to configure token exchange by creating multiple routes. A route lets you optimize behavior based on the type of content, client attributes, and your freshness requirements. In the following examples, we use routes to configure token exchange for each part of a media request.

Configure the primary manifest route to require short-duration tokens

Configure Media CDN to require short-duration tokens on the primary manifest route.

Console

Enable short-duration token authentication on the primary manifest route:

  1. In the Google Cloud console, go to the Media CDNpage.

    Go to Media CDN

  2. To open the Detailspage of a service, click the service name.

  3. To switch to the edit mode, click the Editbutton.

  4. To navigate to the Routingsection, click Next.

  5. Expand the host rule to which you'd like to add the primary manifest route rule.

  6. Click Add route rule.

    Alternatively, to edit a route rule, click Editon the respective row.

  7. In the Edit route rulepane, for Priority, set a value—for example, 1 .

  8. For Description, provide a brief description that can help identify the rule in the list of rules.

  9. In the Matchsection, click Add a match condition. Then, do the following:

    1. For Match type, select Path template match.
    2. For Path match, specify the names or path templates for the HLS primary playlist (M3U8) or DASH manifest (MPD) file. For more information, see Path matching .
  10. Click Advanced configurations.

  11. In the Route actionsection, click Add an item.

  12. For Type, select CDN policy.

  13. In the Signed requestsection, for Signed request mode, select Require tokens.

  14. In the Signed request keysetsection, do the following:

    1. To specify the keyset for short-duration tokens, click Select a keysetand select your short-duration token keyset .

      Alternatively, to create a new keyset that has the keys that you need, click Create new keyset. Then, select it.

    2. For Signature algorithm, select Ed25519 using public keys.

    3. For Token query parameter, retain the default value, edge-cache-token .

      Alternatively, if you plan to use HLS manifest URL query parameters rather than cookies for authentication, specify the parameter in which to store the request tokens.

    4. For Max time to live, specify, in seconds, the maximum lifespan of incoming request tokens.

  15. To save the changes in the Route actionsection, click Done.

  16. To save the changes in the route rule, click Save.

gcloud and YAML

  1. Export your Media CDN configuration into a YAML file. Use the gcloud edge-cache services export command .

      gcloud 
      
     edge 
     - 
     cache 
      
     services 
      
     export 
      
      SERVICE_NAME 
     
      
    \  
     -- 
     destination 
     = 
      FILENAME 
     
     . 
     yaml 
     
    

    Replace the following:

    • SERVICE_NAME : the name of your service
    • FILENAME : the name of your YAML file
  2. To enable short-duration token authentication in the primary manifest route rule, in the route's cdnPolicy section of the YAML file, specify a signedTokensOptions configuration.

       
     pathMatchers 
     : 
      
     - 
      
     name 
     : 
      
     " ROUTE_NAME 
    " 
      
     routeRules 
     : 
      
     - 
      
     priority 
     : 
      
     1 
      
     description 
     : 
      
     " ROUTE_DESCRIPTION 
    " 
      
     origin 
     : 
      
     " ORIGIN_NAME 
    " 
      
     matchRules 
     : 
      
     - 
      
     pathTemplateMatch 
     : 
      
     "/ MANIFEST_OR_PLAYLIST 
    " 
      
     routeAction 
     : 
      
     cdnPolicy 
     : 
      
     cacheMode 
     : 
      
     CACHE_ALL_STATIC 
      
     signedRequestMode 
     : 
      
     REQUIRE_TOKENS 
      
     signedRequestKeyset 
     : 
      
      SHORT_KEYSET_NAME 
     
      
     signedRequestMaximumExpirationTtl 
     : 
      
      SIGNED_REQUEST_MAXIMUM_EXPIRATION_TIME 
     
      
     signedTokenOptions 
     : 
      
     tokenQueryParameter 
     : 
      
      SHORT_TOKEN_NAME 
     
     
    

    Replace the following:

    • ROUTE_NAME : the name of the route rule
    • ROUTE_DESCRIPTION : a description of the route rule
    • ORIGIN_NAME : the origin name
    • MANIFEST_OR_PLAYLIST : the name of the HLS primary playlist (M3U8) or DASH manifest (MPD) file. For more information, see Path matching .
    • SHORT_KEYSET_NAME : the keyset name to use for short-duration tokens
    • SIGNED_REQUEST_MAXIMUM_EXPIRATION_TIME : the expiration time for signed requests—for example, 600s . For more information, see signedRequestMaximumExpirationTtl .
    • Optional: SHORT_TOKEN_NAME : the query parameter in which to find the short token. The default value is edge-cache-token . For more information, see SignedTokenOptions .

    When using symmetric-key HMACs, in the signedTokenOptions section, append allowedSignatureAlgorithms with its value as HMAC_SHA_256 :

       
     allowedSignatureAlgorithms 
     : 
      
     - 
      
     HMAC_SHA_256 
     
    
  3. To update the service, import your Media CDN configuration from the YAML file. Use the gcloud edge-cache services import command .

      gcloud 
     edge 
     - 
     cache 
     services 
     import 
      
      SERVICE_NAME 
     
    \ -- 
     source 
     = 
      FILENAME 
     
     . 
     yaml 
     
    

This completes the process of enabling single-token authentication.

To configure dual-token authentication, proceed to the following sections.

Configure the primary manifest route rule to generate long-duration tokens

Configure Media CDN to generate long-duration tokens on the primary manifest route. Choose either cookies or URL query parameters to generate these tokens.

Console

Modify the primary manifest route rule so that Media CDN can generate long-duration tokens on the route:

  1. On the Edit route rulepage, click Advanced configurations.
  2. For Type, select CDN policy.
  3. Expand Dual-token authentication.
  4. For Signature action, select Generate new long-duration token.
  5. For Signature type, select either of the following options:

    • via cookies (for HLS and DASH streaming): configures Media CDN to return an Edge-Cache-Cookie with the primary manifest response.
    • via HLS manifest URL query parameters (cookieless): configures Media CDN to manipulate the HLS primary manifest by appending a long-duration token to each URL.
  6. In the Generate new long-duration tokensection, do the following:

    1. To specify a keyset for long-duration tokens, click Select a keysetand select your long-duration token keyset .

      Alternatively, click Create new keysetto create a new keyset that has the keys that you need. Then, select it.

    2. For Token TTL, specify, in seconds, the maximum lifespan of the long-duration token.

    3. For Signature type, if you selected the via cookiesoption, then, in the Copied parameterssection, select the parameters that you want Media CDN to copy from the short-duration token to the long-duration token. To use dual-token authentication, you must select either PathGlobs (or either of its aliases, acl or paths ) or URLPrefix .

      If you selected the via HLS manifest URL query parametersoption, for Token query parameter, retain the default value, edge-cache-token .

  7. To save the changes in the Route actionsection, click Done.

  8. To save the changes in the route rule, click Save.

    A message appears asking if you'd like to create the routes for media playlists and segments automatically or manually. If you select the automatic option, a single new route is created for the cookies signature and two routes for the cookieless signature. If you select the manual option, proceed to the next section.

gcloud and YAML

Modify the addSignatures section of the primary manifest route rule so that Media CDN can generate long-duration tokens on the route:

Cookies

   
 addSignatures 
 : 
  
 actions 
 : 
  
 - 
  
 GENERATE_COOKIE 
  
 keyset 
 : 
  
  LONG_KEYSET_NAME 
 
  
 tokenTtl 
 : 
  
  TOKEN_EXPIRATION_TIME 
 
  
 copiedParameters 
 : 
  
 - 
  
 PathGlobs 
  
 - 
  
 SessionID 
 

Replace the following:

  • LONG_KEYSET_NAME : the name of your long-duration token keyset

  • TOKEN_EXPIRATION_TIME : the expiration time of the long-duration token—for example, 86400s for a one-day expiration time

This code example implements the following changes:

  • addSignatures.actions: GENERATE_COOKIE : configures Media CDN to return an Edge-Cache-Cookie with the primary manifest response

  • copiedParameters.PathGlobs : configures Media CDN to copy the PathGlobs from the short-duration token to the long-duration token. To use dual-token authentication, you must use either copiedParameters.PathGlobs or copiedParameters.URLPrefix . For more information, see copiedParameters .

  • Optional: copiedParameters.SessionID : configures Media CDN to copy the SessionID from the short-duration token to the long-duration token

When the GENERATE_COOKIE action is applied, Media CDN returns a Set-Cookie header similar to the following with the primary manifest response:

Set-Cookie: Edge-Cache-Cookie=PathGlobs= PATHS 
~SessionID= SESSION_ID 
~Expires= EXPIRATION 
~_GO=Generated~Signature= SIGNATURE 

URL query parameters

   
 addSignatures 
 : 
  
 actions 
 : 
  
 - 
  
 GENERATE_TOKEN_HLS_COOKIELESS 
  
 keyset 
 : 
  
  LONG_KEYSET_NAME 
 
  
 tokenTtl 
 : 
  
  TOKEN_EXPIRATION_TIME 
 
  
 copiedParameters 
 : 
  
 - 
  
 PathGlobs 
  
 - 
  
 SessionID 
  
 tokenQueryParameter 
 : 
  
  LONG_TOKEN_NAME 
 
 

Replace the following:

  • LONG_KEYSET_NAME : the name of your long-duration keyset

  • TOKEN_EXPIRATION_TIME : the expiration time of the long-duration token—for example, 86400s for a one-day expiration time

This code example implements the following changes:

  • addSignatures.actions: GENERATE_TOKEN_HLS_COOKIELESS : configures Media CDN to manipulate the HLS primary manifest by appending a long-duration token to each URI present.

  • copiedParameters.PathGlobs : configures Media CDN to copy the PathGlobs from the short-duration token to the long-duration token. To use dual-token authentication, you must use one of copiedParameters.PathGlobs or copiedParameters.URLPrefix . For more information, see copiedParameters .

  • Optional: copiedParameters.SessionID : configures Media CDN to copy the SessionID from the short-duration token to the long-duration token.

  • Optional: LONG_TOKEN_NAME : the query parameter in which to put the generated long token. The default value is edge-cache-token . For more information, see tokenQueryParameter .

The following manifest file shows the GENERATE_TOKEN_HLS_COOKIELESS action applied:

#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=1280000,AVERAGE-BANDWIDTH=1000000
http://example.com/HLS_PRIMARY_PLAYLIST.m3u8? LONG_TOKEN_NAME 
=PathGlobs= PATHS 
~SessionID= SESSION_ID 
~Expires= EXPIRATION 
~_GO=Generated~Signature= SIGNATURE 

Media CDN verifies the short-duration token and then generates and stores the long-duration token in the LONG_TOKEN_NAME query parameter.

Configure the media playlist and segments routes to require long-duration tokens

Configure the media playlist and segments routes to require long-duration tokens.

Console

Cookies

Create a route rule for the media playlist and segments route:

  1. On the Edit Edge Cache servicepage, in the Routingsection, click the host rule that has the primary manifest route.
  2. Click Add route rule.
  3. In the Edit route rulepane, for Priority, set a value that's greater than that of the primary manifest route—for example, 2 . Higher values indicate lower priority.
  4. For Description, provide a brief description that can help identify the rule in the list of rules.
  5. Set the following fields as suggested:

    • Select an origin: same as for the primary manifest route rule
    • Add a match condition: same as for the primary manifest route rule
    • Type: CDN policy
    • Signed request mode: Require tokens
    • Select a keyset: same as for long-duration tokens
    • Signature algorithm: same as for the primary manifest route rule
  6. Expand Dual-token authentication.

  7. For Signature action, retain the default value None.

  8. Click Done, and then click Save.

URL query parameters

  1. Create a route rule for the media playlist.

    1. On the Edit Edge Cache servicepage, in the Routingsection, click the host rule that has the primary manifest route.
    2. Click Add route rule.
    3. In the Edit route rulepane, for Priority, set a value that's greater than that of the primary manifest route—for example, 2 . Higher values indicate lower priority.
    4. For Description, provide a brief description that can help identify the rule in the list of rules.
    5. Set the following fields as suggested:

      • Select an origin: the same as for the primary manifest route rule
      • Add a match condition: the same as for the primary manifest route rule
      • Type: CDN policy
      • Signed request mode: Require tokens
      • Select a keyset: the same as for long-duration tokens
      • Signature algorithm: the same as for the primary manifest route rule
      • Token query parameter: the same as for long-duration tokens
    6. Expand Dual-token authentication.

    7. For Signature action, select Propagate existing long-duration token.

      This option is enabled only after Media CDN verifies that the long-duration token was generated by using the via HLS manifest URL query parameters (cookieless)signature type.

    8. For Token query parameter, retain the default value, edge-cache-token .

    9. Click Done, and then click Save.

  2. Create a route rule for media segments.

    This route is like the route for media playlists, with the following key differences:

    • For Priority, set a value that's greater than that of the media playlist route rule—for example, 3 .
    • For Description, provide a brief description that can help identify the rule in the list of rules.
    • In the Dual-token authenticationsection, for Signature action, retain the default value None.

gcloud and YAML

Edit the YAML file:

Cookies

Configure the media playlist and segments to require long-duration cookies:

   
 - 
  
 priority 
 : 
  
 2 
  
 description 
 : 
  
 " SEGMENTS_ROUTE_DESCRIPTION 
" 
  
 origin 
 : 
  
 " ORIGIN_NAME 
" 
  
 matchRules 
 : 
  
 - 
  
 pathTemplateMatch 
 : 
  
 "/**.m3u8" 
  
 # HLS media playlists 
  
 - 
  
 pathTemplateMatch 
 : 
  
 "/**.ts" 
  
 # HLS segments 
  
 - 
  
 pathTemplateMatch 
 : 
  
 "/**.m4s" 
  
 # DASH / CMAF segments 
  
 routeAction 
 : 
  
 cdnPolicy 
 : 
  
 cacheMode 
 : 
  
 CACHE_ALL_STATIC 
  
 signedRequestMode 
 : 
  
 REQUIRE_TOKENS 
  
 signedRequestKeyset 
 : 
  
  LONG_KEYSET_NAME 
 
 

Replace SEGMENTS_ROUTE_DESCRIPTION with a description of the route.

This code example implements the following changes:

  • priority: 2 : the priority of the route. Higher values indicate lower priority. Because the route for your media playlists and media segments matches any filename ending in .m3u8 , the priority for the route must be lower than the route you previously created for the primary manifest.
  • signedRequestMode: REQUIRE_TOKENS : enforces tokens for media playlists and media segments. If you're using static media presentation description (MPD) files, then the long and short keysets may be different. If you're using dynamic MPD files, then the long and short keysets must be the same.
  • signedRequestKeyset: LONG_KEYSET_NAME : Media CDN uses the long-duration keyset to validate the long-duration cookie supplied by a user agent for media playlist and media segment requests.

URL query parameters

Add two route configurations:

  1. Configure the HLS media manifest routes to propagate long-duration tokens:

       
     - 
      
     priority 
     : 
      
     2 
      
     description 
     : 
      
     " PLAYLIST_ROUTE_DESCRIPTION 
    " 
      
     origin 
     : 
      
     " ORIGIN_NAME 
    " 
      
     matchRules 
     : 
      
     - 
      
     pathTemplateMatch 
     : 
      
     "/**.m3u8" 
      
     # HLS media playlists 
      
     routeAction 
     : 
      
     cdnPolicy 
     : 
      
     cacheMode 
     : 
      
     CACHE_ALL_STATIC 
      
     signedRequestMode 
     : 
      
     REQUIRE_TOKENS 
      
     signedRequestKeyset 
     : 
      
      LONG_KEYSET_NAME 
     
      
     addSignatures 
     : 
      
     actions 
     : 
      
     - 
      
     PROPAGATE_TOKEN_HLS_COOKIELESS 
     
    

    Replace PLAYLIST_ROUTE_DESCRIPTION with a description of the route.

    This code example implements the following changes:

    • priority: 2 : the priority of the route. Higher values indicate lower priority. Because the route for your media playlists matches any filename ending in .m3u8 , the priority for the route must be lower than the route you previously created for the primary manifest.
    • signedRequestMode: REQUIRE_TOKENS : enforces tokens for media playlists and media segments. If you're using static media presentation description (MPD) files, the long and short keysets may be different. If you're using dynamic MPD files, then the long and short keysets must be the same.
    • signedRequestKeyset: LONG_KEYSET_NAME : Media CDN uses the long-duration keyset to validate the long-duration cookie supplied by a user agent for media playlist and media segment requests.
    • addSignatures.actions: PROPAGATE_TOKEN_HLS_COOKIELESS : configures Media CDN to copy the long-duration token to media segment URIs in the media playlists.
  2. Configure the segment routes to require long-duration tokens:

       
     - 
      
     priority 
     : 
      
     3 
      
     description 
     : 
      
     " SEGMENTS_ROUTE_DESCRIPTION 
    " 
      
     origin 
     : 
      
     " ORIGIN_NAME 
    " 
      
     matchRules 
     : 
      
     - 
      
     pathTemplateMatch 
     : 
      
     "/**.ts" 
      
     # HLS segments 
      
     routeAction 
     : 
      
     cdnPolicy 
     : 
      
     cacheMode 
     : 
      
     CACHE_ALL_STATIC 
      
     signedRequestMode 
     : 
      
     REQUIRE_TOKENS 
      
     signedRequestKeyset 
     : 
      
      LONG_KEYSET_NAME 
     
     
    

    Replace SEGMENTS_ROUTE_DESCRIPTION with a description of the route.

    This code example implements the following changes:

    • priority: 3 : the priority of the route. Higher values indicate lower priority. The priority for this route must be lower than the route you previously created for the media playlists.
    • signedRequestMode: REQUIRE_TOKENS : enforces tokens for media playlists and media segments.
    • signedRequestKeyset: LONG_KEYSET_NAME : Media CDN uses the long-duration keyset to validate the long-duration signed token supplied by a user agent for media playlist and media segment requests.

Example configuration file

The following code sample shows a completed configuration file:

Cookies

  name 
 : 
  
  SERVICE_NAME 
 
 routing 
 : 
  
 hostRules 
 : 
  
 - 
  
 hosts 
 : 
  
 - 
  
  DOMAIN_NAME 
 
  
 pathMatcher 
 : 
  
 routes 
  
 pathMatchers 
 : 
  
 - 
  
 name 
 : 
  
 " ROUTE_NAME 
" 
  
 routeRules 
 : 
  
 - 
  
 priority 
 : 
  
 1 
  
 description 
 : 
  
 " ROUTE_DESCRIPTION 
" 
  
 origin 
 : 
  
 " ORIGIN_NAME 
" 
  
 matchRules 
 : 
  
 - 
  
 pathTemplateMatch 
 : 
  
 "/ HLS_MASTER_PLAYLIST 
.m3u8" 
  
 # HLS primary playlists 
  
 - 
  
 pathTemplateMatch 
 : 
  
 "/ DASH_MANIFESTS 
.mpd" 
  
 # DASH manifests 
  
 routeAction 
 : 
  
 cdnPolicy 
 : 
  
 cacheMode 
 : 
  
 CACHE_ALL_STATIC 
  
 signedRequestMode 
 : 
  
 REQUIRE_TOKENS 
  
 signedRequestKeyset 
 : 
  
  SHORT_KEYSET_NAME 
 
  
 signedRequestMaximumExpirationTtl 
 : 
  
  SIGNED_REQUEST_MAXIMUM_EXPIRATION_TIME 
 
  
 addSignatures 
 : 
  
 actions 
 : 
  
 - 
  
 GENERATE_COOKIE 
  
 keyset 
 : 
  
  LONG_KEYSET_NAME 
 
  
 tokenTtl 
 : 
  
  TOKEN_EXPIRATION_TIME 
 
  
 copiedParameters 
 : 
  
 - 
  
 PathGlobs 
  
 - 
  
 SessionID 
  
 - 
  
 priority 
 : 
  
 2 
  
 description 
 : 
  
 " SEGMENTS_ROUTE_DESCRIPTION 
" 
  
 origin 
 : 
  
 " ORIGN_NAME 
" 
  
 matchRules 
 : 
  
 - 
  
 pathTemplateMatch 
 : 
  
 "/**.m3u8" 
  
 # HLS media playlists 
  
 - 
  
 pathTemplateMatch 
 : 
  
 "/**.ts" 
  
 # HLS segments 
  
 - 
  
 pathTemplateMatch 
 : 
  
 "/**.m4s" 
  
 # DASH / CMAF segments 
  
 routeAction 
 : 
  
 cdnPolicy 
 : 
  
 cacheMode 
 : 
  
 CACHE_ALL_STATIC 
  
 signedRequestMode 
 : 
  
 REQUIRE_TOKENS 
  
 signedRequestKeyset 
 : 
  
  LONG_KEYSET_NAME 
 
 

URL query parameters

  name 
 : 
  
  SERVICE_NAME 
 
 routing 
 : 
  
 hostRules 
 : 
  
 - 
  
 hosts 
 : 
  
 - 
  
  DOMAIN_NAME 
 
  
 pathMatcher 
 : 
  
 routes 
  
 pathMatchers 
 : 
  
 - 
  
 name 
 : 
  
 " ROUTE_NAME 
" 
  
 routeRules 
 : 
  
 - 
  
 priority 
 : 
  
 1 
  
 description 
 : 
  
 " ROUTE_DESCRIPTION 
" 
  
 origin 
 : 
  
 " ORIGIN_NAME 
" 
  
 matchRules 
 : 
  
 - 
  
 pathTemplateMatch 
 : 
  
 "/ HLS_PRIMARY_PLAYLIST 
.m3u8" 
  
 # HLS primary playlists 
  
 routeAction 
 : 
  
 cdnPolicy 
 : 
  
 cacheMode 
 : 
  
 CACHE_ALL_STATIC 
  
 signedRequestMode 
 : 
  
 REQUIRE_TOKENS 
  
 signedRequestKeyset 
 : 
  
  SHORT_KEYSET_NAME 
 
  
 signedRequestMaximumExpirationTtl 
 : 
  
  SIGNED_REQUEST_MAXIMUM_EXPIRATION_TIME 
 
  
 signedTokenOptions 
 : 
  
 tokenQueryParameter 
 : 
  
  SHORT_TOKEN_NAME 
 
  
 addSignatures 
 : 
  
 actions 
 : 
  
 - 
  
 GENERATE_TOKEN_HLS_COOKIELESS 
  
 keyset 
 : 
  
  LONG_KEYSET_NAME 
 
  
 tokenTtl 
 : 
  
  TOKEN_EXPIRATION_TIME 
 
  
 tokenQueryParameter 
 : 
  
  LONG_TOKEN_NAME 
 
  
 copiedParameters 
 : 
  
 - 
  
 PathGlobs 
  
 - 
  
 SessionID 
  
 - 
  
 priority 
 : 
  
 2 
  
 description 
 : 
  
 " PLAYLIST_ROUTE_DESCRIPTION 
" 
  
 origin 
 : 
  
 " ORIGIN_NAME 
" 
  
 matchRules 
 : 
  
 - 
  
 pathTemplateMatch 
 : 
  
 "/**.m3u8" 
  
 # HLS media playlists 
  
 routeAction 
 : 
  
 cdnPolicy 
 : 
  
 cacheMode 
 : 
  
 CACHE_ALL_STATIC 
  
 signedRequestMode 
 : 
  
 REQUIRE_TOKENS 
  
 signedRequestKeyset 
 : 
  
  LONG_KEYSET_NAME 
 
  
 addSignatures 
 : 
  
 actions 
 : 
  
 - 
  
 PROPAGATE_TOKEN_HLS_COOKIELESS 
  
 - 
  
 priority 
 : 
  
 3 
  
 description 
 : 
  
 " SEGMENTS_ROUTE_DESCRIPTION 
" 
  
 origin 
 : 
  
 " ORIGIN_NAME 
" 
  
 matchRules 
 : 
  
 - 
  
 pathTemplateMatch 
 : 
  
 "/**.ts" 
  
 # HLS segments 
  
 routeAction 
 : 
  
 cdnPolicy 
 : 
  
 cacheMode 
 : 
  
 CACHE_ALL_STATIC 
  
 signedRequestMode 
 : 
  
 REQUIRE_TOKENS 
  
 signedRequestKeyset 
 : 
  
  LONG_KEYSET_NAME 
 
 

Generate short-duration tokens at your application server

For information about generating tokens, see Generate tokens .

Apply defense-in-depth content protections

As a best practice, enable origin authentication as follows:

Create a Mobile Website
View Site in Mobile | Classic
Share by: