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éponse200confirme la réussite de l'authentification.
-
Testez une URL non signée :
curl -I http://esa.aliyun.top/test.mp4. Une réponse401confirme le rejet de la requête.
-
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éponse200confirme la réussite de l'authentification.
-
Testez une URL non signée :
http://esa.aliyun.top/test.mp4. Une réponse401confirme le rejet de la requête.
-
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éponse200confirme la réussite de l'authentification.
-
Testez une URL non signée :
http://esa.aliyun.top/test.mp4. Une réponse401confirme le rejet de la requête.
-
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.RemarqueUne URL signée expire à l'instant
timestampaugmenté d'une période de validité configurée dans ESA. Dans les exemples de code, cette période correspond à la variabledelta. 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
md5hashse 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).
RemarqueVous 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 exemple477b3bbc253f467b8def6711128c7bec.uid: ID utilisateur. Définissez cette valeur selon vos besoins métier.auth_key: Chaîne d'authentification composée detimestamp,rand,uidetmd5hash.