Todos os produtos
Search
Central de documentação

Edge Security Acceleration:Configure URL signing

Última atualização: Jun 29, 2026

Implemente a assinatura de URL no Edge Security Accelerator (ESA) com modelos de Edge Function. Os métodos A, B e C usam assinaturas baseadas em MD5 para proteger recursos como arquivos e endpoints de API. Cada método inclui exemplos de código e descrições de parâmetros.

Como funciona

A assinatura de URL protege os recursos de origem ao bloquear solicitações sem autenticação válida.

Métodos de autenticação

O ESA oferece três métodos de autenticação (A, B e C). Cada um compara o hash MD5 da URL com outro calculado no ponto de presença (POP). Hashes correspondentes autorizam a solicitação; divergências a negam.

Método A

  • Formato da URL assinada: http://DomainName/Filename?auth_key={timestamp}-{rand}-{uid}-{md5hash}. Consulte as definições dos campos em Parâmetros.

  • Código de exemplo

    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)
      }
    }
  • Teste e verifique

    • Teste uma URL assinada válida: curl -I http://esa.aliyun.top/video/test.mp4?auth_key=1743388566-61b20a42d14f403ba3790d1b82502027-1-ee1c2c463a41ef4d72fcff5987f1e08c. A resposta 200 confirma a autenticação bem-sucedida.

      image

    • Teste uma URL não assinada: curl -I http://esa.aliyun.top/test.mp4. A resposta 401 indica que a solicitação foi negada.

      image

Método B

  • Formato da URL assinada: http://DomainName/{timestamp}/{md5hash}/FileName. Consulte as definições dos campos em Parâmetros.

  • Código de exemplo

    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)
      }
    }
  • Teste e verifique

    • Teste uma URL assinada válida: curl -I http://esa.aliyun.top/1743391454/f1415e282ae5ae650455e7b525231eff/test.mp4. A resposta 200 confirma a autenticação bem-sucedida.

      image

    • Teste uma URL não assinada: http://esa.aliyun.top/test.mp4. A resposta 401 indica que a solicitação foi negada.

      image

Método C

  • Formato da URL assinada: http://DomainName/{md5hash}/{timestamp}/FileName. Consulte as definições dos campos em Parâmetros.

  • Código de exemplo

    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)
      }
    }
  • Teste e verifique

    • Teste uma URL assinada válida: curl -I http://esa.aliyun.top/e59c904c85f19a48413b6283fc9d2f5a/1743400480/test.mp4. A resposta 200 confirma a autenticação bem-sucedida.

      image

    • Teste uma URL não assinada: http://esa.aliyun.top/test.mp4. A resposta 401 indica que a solicitação foi negada.

      image

Parâmetros

  • DomainName: registro DNS do site ESA.

  • timestamp: timestamp Unix (segundos desde a época) da geração da URL assinada. Define a expiração junto com o TTL. No Método C, o valor é uma string hexadecimal.

    Nota

    A URL assinada expira após o timestamp somado ao período de validade configurado no ESA. O código de exemplo define esse período na variável delta.

  • FileName: caminho do arquivo solicitado no servidor de origem. Deve começar com barra normal (/).

  • md5hash: string hexadecimal de 32 caracteres (0-9, a-z) gerada pelo algoritmo MD5.

    Cálculo do md5hash:

    • Método de Autenticação A: getMd5(FileName + "-" + timestamp + "-" + rand + "-" + uid + "-" + your_secret_key).

    • Método de Autenticação B: getMd5(your_secret_key + timestamp + FileName).

    • Método de Autenticação C: getMd5(your_secret_key + "-" + FileName + "-" + timestamp).

    Nota

    Implemente a função getMd5 manualmente.

  • rand: string aleatória para garantir unicidade à URL assinada. Use um UUID sem hifens, como 477b3bbc253f467b8def6711128c7bec.

  • uid: ID do usuário. Defina conforme os requisitos do negócio.

  • auth_key: string de autenticação composta por timestamp, rand, uid e md5hash.