Tous les produits
Search
Centre de documentation

Edge Security Acceleration:Configurer la signature d'URL

Dernière mise à jour :Aug 12, 2026

Implémentez la signature d'URL pour Edge Security Accelerator (ESA) à l'aide de modèles d'Edge Functions. Trois méthodes (A, B et C) utilisent des signatures basées sur MD5 pour protéger des ressources telles que des fichiers et des endpoints d'API. Chaque méthode comprend des exemples de code et une description des paramètres.

Fonctionnement

La signature d'URL protège vos ressources d'origine en bloquant les requêtes dont l'authentification échoue.

Méthodes d'authentification

ESA propose trois méthodes d'authentification (A, B et C). Chacune compare un hachage MD5 présent dans l'URL à celui calculé au point de présence (POP). Une correspondance autorise la requête ; une divergence entraîne son rejet.

Méthode A

  • Format de l'URL signée : http://DomainName/Filename?auth_key={timestamp}-{rand}-{uid}-{md5hash}. Chaque champ est défini dans la section Paramètres.

  • Exemple de code

    import { createHash } from "node:crypto";
    
    async function handleRequest(request) {
      const url = new URL(request.url);
      const path = url.pathname;
      const delta = 3600;
    
      const authKeyTypeA = url.searchParams.get('auth_key');
    
      const privateKey = 'your_secret_key'
      const currentTimestamp = Math.floor(Date.now() / 1000);
    
      if (!authKeyTypeA) {
        return new Response('Unauthorized', { status: 401 });
      }
    
      const [timestamp, rand, uid, signature] = authKeyTypeA.split('-');
    
      if (currentTimestamp > parseInt(timestamp)+ delta) {
        return new Response('Link expired', { status: 403 });
      }
    
      const signString = [path, timestamp, rand, uid, privateKey].join('-');
    
      const md5 = createHash('md5').update(signString).digest('hex');
    
      if (md5 !== signature) {
        return new Response('Unauthorized', { status: 401 });
      }
    
      // If the resource is on another domain, fetch it and return the response
      // const yourUrl = `https://your-dcdn-domain.com${path}${url.search}`
      // const cdnResponse = await fetch(yourUrl, request)
      // return new Response(cdnResponse.body, cdnResponse)
    
      // In most cases, one origin fetch is sufficient
      return fetch(request.url)
    }
    
    export default {
      async fetch(request) {
        return handleRequest(request)
      }
    }
  • Test et vérification

    • Testez une URL signée valide : curl -I http://esa.aliyun.top/video/test.mp4?auth_key=1743388566-61b20a42d14f403ba3790d1b82502027-1-ee1c2c463a41ef4d72fcff5987f1e08c. Une réponse 200 confirme la réussite de l'authentification.

      image

    • Testez une URL non signée : curl -I http://esa.aliyun.top/test.mp4. Une réponse 401 confirme le rejet de la requête.

      image

Méthode B

  • Format de l'URL signée : http://DomainName/{timestamp}/{md5hash}/FileName. Chaque champ est défini dans la section Paramètres.

  • Exemple de code

    import { createHash } from "node:crypto";
    
    function handleRequest(request) {
      const url = new URL(request.url);
      const path = url.pathname;
      const parts = path.split('/');
      const delta = 3600;
      const privateKey = 'your_secret_key'
      const currentTimestamp = Math.floor(Date.now() / 1000);
      const timestamp = parts[1];
      const signature = parts[2];
    
      if (!timestamp || !signature) {
        return new Response('Unauthorized', { status: 401 });
      }
    
      const filePath = '/' + parts.slice(3).join('/');
      const signString = [privateKey, timestamp, filePath].join('');
      const md5 = createHash('md5').update(signString).digest('hex');
    
      if (md5 !== signature) {
        return new Response('Unauthorized', { status: 401 });
      }
    
      if (currentTimestamp > parseInt(timestamp)+ delta) {
        return new Response('Link expired', { status: 403 });
      }
    
      // If the resource is on another domain, fetch it and return the response
      // const yourUrl = `https://your-dcdn-domain.com${path}${url.search}`
      // const cdnResponse = await fetch(yourUrl, request)
      // return new Response(cdnResponse.body, cdnResponse)
    
      // For Authentication Method B, reconstruct the original file path for the origin fetch.
      return fetch(url.origin + filePath)
    }
    
    export default {
      async fetch(request) {
        return handleRequest(request)
      }
    }
  • Test et vérification

    • Testez une URL signée valide : curl -I http://esa.aliyun.top/1743391454/f1415e282ae5ae650455e7b525231eff/test.mp4. Une réponse 200 confirme la réussite de l'authentification.

      image

    • Testez une URL non signée : http://esa.aliyun.top/test.mp4. Une réponse 401 confirme le rejet de la requête.

      image

Méthode C

  • Format de l'URL signée : http://DomainName/{md5hash}/{timestamp}/FileName. Chaque champ est défini dans la section Paramètres.

  • Exemple de code

    import { createHash } from "node:crypto";
    
    function handleRequest(request) {
      const url = new URL(request.url);
      const path = url.pathname;
      const parts = path.split('/');
      const delta = 3600;
      const privateKey = 'your_secret_key'
      const currentTimestamp = Math.floor(Date.now() / 1000);
      const signature = parts[1];
      const hexTime = parts[2];
      const timestamp = parseInt(hexTime, 16);
    
      if (!hexTime || !signature) {
        return new Response('Unauthorized', { status: 401 });
      }
    
      const filePath = '/' + parts.slice(3).join('/');
      const signString = [privateKey, filePath, hexTime].join('-');
      const md5 = createHash('md5').update(signString).digest('hex');
    
      if (md5 !== signature) {
        return new Response('Unauthorized', { status: 401 });
      }
    
      if (currentTimestamp > parseInt(timestamp)+ delta) {
        return new Response('Link expired', { status: 403 });
      }
    
      // If the resource is on another domain, fetch it and return the response
      // const yourUrl = `https://your-dcdn-domain.com${path}${url.search}`
      // const cdnResponse = await fetch(yourUrl, request)
      // return new Response(cdnResponse.body, cdnResponse)
    
      // For Authentication Method C, reconstruct the original file path for the origin fetch.
      return fetch(url.origin + filePath)
    }
    
    export default {
      async fetch(request) {
        return handleRequest(request)
      }
    }
  • Test et vérification

    • Testez une URL signée valide : curl -I http://esa.aliyun.top/e59c904c85f19a48413b6283fc9d2f5a/1743400480/test.mp4. Une réponse 200 confirme la réussite de l'authentification.

      image

    • Testez une URL non signée : http://esa.aliyun.top/test.mp4. Une réponse 401 confirme le rejet de la requête.

      image

Paramètres

  • DomainName : Enregistrement DNS de votre site ESA.

  • timestamp : Horodatage Unix (secondes écoulées depuis l'époque) correspondant à la génération de l'URL signée. Cette valeur, combinée à la durée de vie (TTL), détermine l'expiration. Pour la méthode C, il s'agit d'une chaîne hexadécimale.

    Remarque

    Une URL signée expire à l'instant timestamp augmenté d'une période de validité configurée dans ESA. Dans les exemples de code, cette période correspond à la variable delta.

  • FileName : Chemin d'accès au fichier demandé sur le serveur d'origine. Ce chemin doit commencer par une barre oblique (/).

  • md5hash : Chaîne hexadécimale de 32 caractères (0-9, a-z) générée par l'algorithme MD5.

    Le md5hash se calcule comme suit :

    • Méthode d'authentification A : getMd5(FileName + "-" + timestamp + "-" + rand + "-" + uid + "-" + your_secret_key).

    • Méthode d'authentification B : getMd5(your_secret_key + timestamp + FileName).

    • Méthode d'authentification C : getMd5(your_secret_key + "-" + FileName + "-" + timestamp).

    Remarque

    Vous devez implémenter manuellement la fonction getMd5.

  • rand : Chaîne aléatoire garantissant l'unicité de chaque URL signée. Utilisez un UUID sans tirets, par exemple 477b3bbc253f467b8def6711128c7bec.

  • uid : ID utilisateur. Définissez cette valeur selon vos besoins métier.

  • auth_key : Chaîne d'authentification composée de timestamp, rand, uid et md5hash.