我在AppEngine上与谷歌云存储工作,我试图用POST形式将文件上传到GCS。 我遇到的问题是与签政策文件所需的步骤。 我可以很容易地获取client_secret,这是从一个字符串client_secrets.json
的API控制台给我。 然而,为了创建一个签名,我需要的是字符串转换成PrivateKey
对象。 下面是我的代码如下所示:
//create the policy document and encode it
String policyDocument = ... //omitted for brevity
String encodedPolicy = Base64.encodeString(policyDocument);
//sign using SHA256 with RSA
String secretKey = ... //I fetch this from client_secrets.json
Signature sig = Signature.getInstance("SHA256withRSA");
sig.initSign(secretKey); //THIS IS THE PROBLEM!
sig.update(encodedPolicy.getBytes("UTF-8"));
String signature = new String(Base64.encode(sig.sign()));
//put the values in the request attributes so we can fetch them from a JSP
req.setAttribute("policy", encodedPolicy);
req.setAttribute("signature", signature);
正如上面提到的,我的问题是在该行
sig.initSign(secretKey); //THIS IS THE PROBLEM!
secretKey
是一个字符串。 Signature.initSign()
需要一个PrivateKey
,或它的子对象中的一个。 如何转换的字符串client_secrets.json
成专用密钥(或派生)对象,我可以通过Signature.initSign
?
任何帮助将不胜感激。 谢谢
OK,这里是我的现在。 我想下面的建议,所有的文档催我使用client_secret从谷歌API控制台,而不是服务帐户下载的client_secrets.json档案。 除此之外,我试图构建一个用户的上传,而不是服务帐户的一个例子。
我发现了另一页上下面的代码:
public static String signPolicyDocument(String policyDocument, String secret) {
try {
Mac mac = Mac.getInstance("HmacSHA256");
byte[] secretBytes = secret.getBytes();
SecretKeySpec signingKey = new SecretKeySpec(secretBytes, "HmacSHA256");
mac.init(signingKey);
byte[] signedSecretBytes = mac.doFinal(policyDocument.getBytes());
return new String(Base64.encode(signedSecretBytes));
} catch (InvalidKeyException e) {
throw new RuntimeException(e);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
它让我一路走过的过程......直到我提交生成的表单。 然后我得到以下回应:
The request signature we calculated does not match the signature you provided. Check your Google secret key and signing method.
它是在寻找什么签名方法?