【发布时间】:2016-04-28 21:07:25
【问题描述】:
我需要使用 Node.js 创建存储在 Google Cloud Storage 中的对象的签名 URL(使用 Google Developer Console 上传)。
这是我的代码:
var gcloud = require('gcloud');
// Google Cloud Storage Bucket Name
const BUCKET_NAME = 'testBucketName123';
// Google Developer Console project ID
const PROJECT_ID = 'testProjectName123';
/* Google Developer Console -> API Manager -> Credentials ->
Add credentials -> Service account -> JSON -> Create */
const KEY_FILENAME = 'testKey.json' // relative path
const SECONDS = 1000; // seconds in milliseconds
const URL_VALID_DURATION = 30 * SECONDS;
var gcs = gcloud.storage({
projectId: PROJECT_ID,
keyFilename: KEY_FILENAME
});
var filename ='tasksel.png';
var file = gcs.bucket(BUCKET_NAME).file(filename);
file.getSignedUrl({
// More documention on options at
// https://googlecloudplatform.github.io/gcloud-node/#/docs/v0.24.1/storage/file?method=getSignedUrl
action: 'write',
expires: Date.now() * URL_VALID_DURATION
}, function (err, url) {
if (err) {
console.error(err);
return;
}
console.log("URL");
console.log("-----");
console.log(url);
console.log("-----");
console.log("PUT to this URL to upload to Google Cloud Storage as " + filename);
});
我得到了这样一个 URL 的输出:
https://storage.googleapis.com/testBucketName123/tasksel.png?GoogleAccessId=keyId@iprojectName.iam.gserviceaccount.com&Expires=NaN&Signature=MmI5cQ3NINpOOP%2Fer02R0LxRZJAHplmstvofDXU139VNmZ0MsxpAOTGg6JUHBr8EztiTdR7cNNltoSb0zpM2DCRK5UpDjlrJ6WriSL2uyDsGWgfdx4M1vS0ussRm9BHAT31tqo0U5cdzgJd5rjakPMV06NUw0YYQn1oAEzE6JwThFfUZa%2FexddP763yDOQDKh5sJxW9go3JNmam%2Bk8qq0wJnVP5GNhl3JGlKW7l5AtimUwaI%2BViasX6LNmvwtoyM4%2Fg6Ebx%2BnI9%2Bk2LxWA3c8MUypeEZj0W8AWv%2BAWjf1bzeCEMTOjxV53bo1SA0zmUGjE6GDVd9PnYomwJ88v2h3Q%3D%3D
但是当我用浏览器打开这个 URL 时得到的输出是:
<Error>
<Code>SignatureDoesNotMatch</Code>
<Message>
The request signature we calculated does not match the signature you provided. Check your Google secret key and signing method.
</Message>
<StringToSign>GET NaN /testBucketName123/tasksel.png</StringToSign>
</Error>
真正的问题是什么?有什么想法吗?
【问题讨论】:
-
这实际上可能是 gcloud 库形成签名的方式的问题。从您的代码看来,您似乎没有机会以一种会导致错误的方式与该进程进行交互。你在什么环境下运行这个? json文件真的和你提供的项目ID对应吗?
-
我在本地 ubuntu 机器上运行它。并确保服务帐户密钥有效。
-
您的系统时钟是否可能不同步?构造签名时,使用
Date.now()。如果基于系统对Date.now()的调用生成的签名与验证签名的服务器不同步,则将导致验证签名失败。 -
在我看来你最终会得到一个天文数字般大的“过期”,因为你正在乘以乘法的结果。
标签: node.js google-cloud-storage gcloud