Cloudflare worker - 验证预签名 url

Cloudflare worker - verify presigned url

我正在玩预签名 urls。 服务器使用节点生成一个预先签名的 url,与对象存储配合得很好。 现在我正在尝试与 Cloudflare 工作人员验证预签名 url,但我不明白。

此服务器代码的工作端有任何解决方案吗?

function expireDate() {
    const d = new Date();
    d.setUTCHours(5, 0, 0, 0); // 5 am
    d.setUTCDate(d.getDate() + 2); // + 2 days
    return Math.floor(d.getTime() / 1000);
}

function generateSignedUrl(url) {
    const expire_date = expireDate();

    // Create HMAC
    const hmac = crypto.createHmac('sha256', 'mystrongkey');
    // Pass the data to be hashed
    console.log(util.format('%s\n%d\n%s', 'GET', expire_date, url));
    data = hmac.update(util.format('%s\n%d\n%s', 'GET', expire_date, url));
    // Create HMAC in the required format
    tempUrlSig = data.digest('hex');

    return url + '?temp_url_sig=' + tempUrlSig + '&temp_url_expires=' + expire_date;
}

const presigned_url = generateSignedUrl('https://example/test.jpg')

我也玩过 Cloudflares 示例 https://developers.cloudflare.com/workers/examples/signing-requests - 但我无法修复 TypeError: Cannot read property 'subtle' of undefined(是的,我试过 const { subtle } = require('crypto').webcrypto; 等等 - 不知道!)

我也对新的服务器代码感到满意,它只需要工作 :-) 还搜索了一种方法来验证 AWS SDK S3 getSignedUrl 输出与 Cloudflare(或什至节点......),但没有'找不到解决方案。

最后我只想保护一个中间有 Cloudflare 的私有存储桶(带宽联盟)。

Cloudflare Workers 的 JavaScript 运行时不基于 Node。因此,不会有一个名为 crypto 的预捆绑模块可供您要求或导入。

如果您从这些配置了 Webpack 的模板项目开始,required/imported 模块通常是您手动安装的模块(例如,通过 npm install/yarn add foobar 并且后来被列为 package.json 中的依赖项).也就是说,有点像写前端JS。

Workers 提供了一个内置的 WebCrypto 兼容加密库实现,如下所述:https://developers.cloudflare.com/workers/runtime-apis/web-crypto。根据文档,crypto 只是一个全局对象,可以通过导入直接访问。

虽然我没有尝试,但我想您给出的示例的 link 是一个完整的 Worker 脚本,不需要进行更多修改来测试。即复制粘贴到Workers的在线编辑器中测试即可。