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 resposta200confirma a autenticação bem-sucedida.
-
Teste uma URL não assinada:
curl -I http://esa.aliyun.top/test.mp4. A resposta401indica que a solicitação foi negada.
-
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 resposta200confirma a autenticação bem-sucedida.
-
Teste uma URL não assinada:
http://esa.aliyun.top/test.mp4. A resposta401indica que a solicitação foi negada.
-
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 resposta200confirma a autenticação bem-sucedida.
-
Teste uma URL não assinada:
http://esa.aliyun.top/test.mp4. A resposta401indica que a solicitação foi negada.
-
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.NotaA URL assinada expira após o
timestampsomado ao período de validade configurado no ESA. O código de exemplo define esse período na variáveldelta. 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).
NotaImplemente a função
getMd5manualmente. rand: string aleatória para garantir unicidade à URL assinada. Use um UUID sem hifens, como477b3bbc253f467b8def6711128c7bec.uid: ID do usuário. Defina conforme os requisitos do negócio.auth_key: string de autenticação composta portimestamp,rand,uidemd5hash.