一、示例代码
function uint8ArrayToHex(uint8Array) { return Array.prototype.map.call(uint8Array, x => ('0' + x.toString(16)).slice(-2)).join('');}async function generateHmac({ secretKey, message, hash }) { const encoder = new TextEncoder(); const secretKeyBytes = encoder.encode(secretKey); const messageBytes = encoder.encode(message);
const key = await crypto.subtle.importKey('raw', secretKeyBytes, { name: 'HMAC', hash }, false, ['sign']); const signature = await crypto.subtle.sign('HMAC', key, messageBytes); const signatureArray = new Uint8Array(signature); return uint8ArrayToHex(signatureArray);}async function handleRequest(request) { const secretKey = 'YOUR_SECRET_KEY'; // 使用时请修改为需要被签名的信息,一般为多个数据的组合,例如:时间戳+请求相关信息等 const message = 'YOUR_MESSAGE';
// hash 取 SHA-1、SHA-256、SHA-384、SHA-512 之一 const hmac = await generateHmac({ secretKey, message, hash: 'SHA-256' }); request.headers.set('Authorization', `HMAC-SHA256 ${hmac}`); return fetch(request);}
addEventListener('fetch', event => { event.passThroughOnException(); event.respondWith(handleRequest(event.request));});
二、示例预览
在 PC 端与移动端的浏览器地址栏中输入匹配到边缘函数触发规则的 URL(如:https://example.com/hmac),即可预览到示例效果。
·身份校验未通过。
·身份校验通过。
三、相关参考
·Runtime APIs: Fetch
·Runtime APIs: Web Crypto
·Runtime APIs: Headers
·Runtime APIs: Response