我正在尝试为Google Cloud Storage中的私人存储文件创建签名;这样我就可以发布一个限时链接
它的签名太短了…我哪里做错了?
var crypto = require("crypto");
var ttl = new Date().getTime() + 3600;
var id = 'the_target_file.txt';
var bucketName = 'bucket_name';
var POLICY_JSON = "GET\n" + "\n" + "\n" + ttl + "\n" + '/' + bucketName + '/' + id;
// stringify and encode the policy
var stringPolicy = JSON.stringify(POLICY_JSON);
var base64Policy = Buffer(stringPolicy, "utf-8").toString("base64");
// sign the base64 encoded policy
var privateKey = "MY_PRIVATE_KEY";
var sha256 = crypto.createHmac("sha256", privateKey);
var signature = sha256.update(new Buffer(base64Policy, "utf-8")).digest("base64");
console.log ( signature );
5条答案
按热度按时间vu8f3i0k1#
现在有一个API/模块用于获取签名的URL。
模块:https://www.npmjs.com/package/@google-cloud/storage
API文档:https://googleapis.dev/nodejs/storage/latest/File.html#getSignedUrl
示例
bvjxkvbb2#
意识到我做错了什么…我在散列策略字符串而不是签名。下面的代码现在给出了正确的输出。
为了完整性...下面是一个PHP版本,它可以做同样的事情,我用它来检查我的结果
3b6akqbq3#
假设这个问题是签名由谷歌桶后端支持的CDN URL,这里什么对我有效(上面的代码不对我有效)。
选项和签名函数调用:
签名功能:
希望这能帮上忙。不知何故,谷歌云文档没有nodejs示例,文件.getSignedUrl()增加了混淆,因为它似乎与CDN URL签名无关。
注意事项:
注意:可能需要将base64 -> buffer的工作作为opts.keyBuffer移到调用者那里
zbsbpyhn4#
如果nodejs
@google-cloud/storage
库已经是项目的一部分,那么最好的方法就是使用它。下面的代码是由谷歌存储sdk文档为nodejs链接在这里npm install @google-cloud/storage
kd3sttzy5#
V4签名URL纯js,无google api库。注意规范请求中的所有新行和路径中的斜线。