【发布时间】:2017-01-25 10:46:00
【问题描述】:
我正在努力创建签名 URL 以将文件上传到 Google 存储。 首先,我使用 JSON 密钥获取私钥和 clientId:
AuthCredentials.ServiceAccountAuthCredentials serviceAccountAuthCredentials = AuthCredentials.ServiceAccountAuthCredentials.createForJson(json_resource.getInputStream());
PrivateKey key = serviceAccountAuthCredentials.credentials().getPrivateKey();
Signature signer = Signature.getInstance("SHA256withRSA");
signer.initSign(key);
之后,创建要签名的字符串:
String upload_uri = "PUT\n\n" + expiration +
"\n/" + bucketName + "/" + folderPath + "/" + fileName;
然后签名字符串:
signer.update(stringToSign.getBytes("UTF-8"));
byte[] rawSignature = signer.sign();
String signature = new String(Base64.encodeBase64(rawSignature, false), "UTF-8");
然后使用签名字符串组成 URL:
final String clientId = serviceAccountAuthCredentials.account();
String url = "http://storage.googleapis.com/" +
bucketName + "/" + folderPath + "/" + fileName +
"?GoogleAccessId=" + clientId +
"&Expires=" + expiration +
"&Signature=" + URLEncoder.encode(signature, "UTF-8");
使用此 URL 我收到错误:
SignatureDoesNotMatch 我们计算的请求签名与您提供的签名不匹配。 检查您的 Google 密钥和签名方法。GET 1485340222074 /bucketName/fileName
【问题讨论】:
-
您能否将您的 stringToSign 与同一 URL 上的 gsutil 等规范示例进行比较?对于初学者,我认为您在 PUT 之后缺少一个 \n (方法、md5 和内容类型应该有一个)。
-
感谢@TravisHobrla 的建议。我试过了——没用。我也尝试添加 contentType - 也没有用。
-
确保您的 StringToSign 遵循 correct format,确保您的过期时间在 Unix Epoch 中正确计算,并且您按照 guide 对其进行签名。还要确保使用 URL 的客户端也提供正确的标头,特别是您设置的内容类型。
标签: java google-app-engine google-cloud-storage google-cloud-platform