Google cloud storage Google云存储-JAVA REST API-获取SignatureDesNotMatch

Google cloud storage Google云存储-JAVA REST API-获取SignatureDesNotMatch,google-cloud-storage,Google Cloud Storage,我正在使用jersey客户端拨打REST电话。我收到SignatureDesNotMatch错误的响应。 我尝试使用GET服务列出Bucket名称,也尝试使用GET Bucket方法列出Bucket对象。 这是我的示例代码 有什么提示或解决办法吗 公共类restSample{ 私有静态最终字符串HMAC_SHA1_ALGORITHM=“HmacSHA1”; 私有静态最终字符串项目\u ID=“10xxxxxxx478”; 公共静态字符串Base64Encoding() 抛出java.securi

我正在使用jersey客户端拨打REST电话。我收到SignatureDesNotMatch错误的响应。 我尝试使用GET服务列出Bucket名称,也尝试使用GET Bucket方法列出Bucket对象。 这是我的示例代码

有什么提示或解决办法吗

公共类restSample{
私有静态最终字符串HMAC_SHA1_ALGORITHM=“HmacSHA1”;
私有静态最终字符串项目\u ID=“10xxxxxxx478”;
公共静态字符串Base64Encoding()
抛出java.security.SignatureException、UnsupportedEncodingException{
字符串访问\u id=“googbaxxxxxxxxxpi”;
字符串secret_key=URLEncoder.encode(“pwtxxxxxxxxxxxxxro85t+XXXXXXXXX3O”,“UTF-8”);
字符串bucket=“bucket\u name”;
字符串版本\ u header=“x-goog-api-version:1”;
字符串project\u header=“x-goog-project-id:”+project\u id;
字符串canonicalizedResources=“/”+bucket+“/”;
日历=Calendar.getInstance();
calendar.add(calendar.MINUTE,30);
long expiration=calendar.getTimeInMillis();
字符串stringToSign=URLEncoder.encode(“GET\n\n”+expiration+“\n”+version\u header+“\n”+project\u header+“\n”+canonicalizedResources,“UTF-8”);
//字符串stringToSign=URLEncoder.encode(“GET\n\n”+getdate()+“\n”+版本\u头+“\n”+项目\u头+“\n”+规范化数据源,“UTF-8”);
字符串authSignature=“”;
试一试{
SecretKeySpec signingKey=新的SecretKeySpec(secret_key.getBytes(),HMAC_SHA1_算法);
Mac Mac=Mac.getInstance(HMAC_SHA1_算法);
mac.init(签名密钥);
//根据输入数据字节计算hmac
byte[]rawHmac=mac.doFinal(stringToSign.getBytes(“UTF-8”);
//base64对hmac进行编码
authSignature=新字符串(Base64.encode(rawHmac));
}捕获(例外e){
抛出新的SignatureException(“未能生成HMAC:+e.getMessage());
}
authSignature=(访问id+:“+authSignature);
返回签名;
}
公共静态void main(字符串[]args){
ClientConfig=newdefaultclientconfig();
Client=Client.create(config);
字符串authSignature=null;
试一试{
authSignature=“GOOG1”+base64编码();
}捕获(签名例外e){
e、 printStackTrace();
}捕获(不支持的编码异常e){
e、 printStackTrace();
}
WebResource服务=client.resource(getBaseURI());
ClientResponse response=service.accept(MediaType.APPLICATION\u XML)
.header(“授权”,authSignature)
.header(“日期”,getdate())
.header(“内容长度”、“0”)
.标题(“x-goog-api-version”,“1”)
.标题(“x-goog-project-id”,项目编号)
.get(ClientResponse.class);
System.out.println(response.getClientResponseStatus().getFamily());
System.out.println(“response1::”+response.getEntity(String.class));
}
私有静态URI getBaseURI(){
字符串url=”https://bucket_name.storage.googleapis.com";
返回UriBuilder.fromUri(url.build();
}
私有静态字符串getdate(){
SimpleDataFormat格式=新SimpleDataFormat(“EEE,dd MMM yyyy HH:mm:ss z”,新语言环境(“US”);
Calendar cal=Calendar.getInstance(新的SimpleTimeZone(0,“GMT”);
设置日历格式(cal);
返回格式。格式(新日期());
}
}

谢谢

确保您要签名的字符串与预期要签名的字符串匹配。如果身份验证失败,Google云存储将返回在HTTP响应中签名的预期字符串

在您的特定示例中,看起来您正在将
version\u标题
project\u标题
添加到要签名的字符串中。这些文件不在
CanonicalHeaders
CanonicalExtensionHeaders
列表中,因此您所签署的字符串与服务器不同

您可以在此处查看列表: