Php 谷歌云存储的互操作访问授权请求失败,出现';签名不匹配';错误
我试图在PHP中使用API v1.0(可互操作模式)在GCS上创建一个bucket,但得到了一个“签名不匹配”错误响应 以下是我正在做的:Php 谷歌云存储的互操作访问授权请求失败,出现';签名不匹配';错误,php,http,google-cloud-storage,Php,Http,Google Cloud Storage,我试图在PHP中使用API v1.0(可互操作模式)在GCS上创建一个bucket,但得到了一个“签名不匹配”错误响应 以下是我正在做的: 以下是我得到的回应: <?xml version='1.0' encoding='UTF-8'?> <Error> <Code>SignatureDoesNotMatch</Code> <Message>The request signature we calculated does
以下是我得到的回应:
<?xml version='1.0' encoding='UTF-8'?>
<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
Sat, 03 Mar 2012 14:56:53 -0800
x-goog-api-version:1
x-goog-project-id:xxxyyyxy
/random_bucket_name/
</StringToSign>
</Error>
知道我哪里出错了吗 以下是谷歌在这方面的文档: 我注意到的一件事是,尽管我在“stringToSign”变量中指定了“PUT”。。。回答说我用了“GET”
任何帮助都将不胜感激 这里有几个问题:
- 您的规范化资源应该是“/bucket/”,而不是“/HTTP 1.1”
- 您需要在要签名的字符串中包含两个自定义标题(x-goog-version和x-goog-project-id)
- 要签名的字符串必须包括在Date:头中发送的时间戳
- 您需要设置CURLOPT_PUT,以便curl知道发送一个PUT请求,而不是默认的GET请求(这就是为什么您的错误响应暗指GET请求)
<?php
$access_id = "REDACTED";
$secret_key = "REDACTED";
$bucket = "your-bucket";
$url = 'https://'.$bucket.'commondatastorage.googleapis.com';
$timestamp = date("r");
$version_header = "x-goog-api-version:1";
$project_header = "x-goog-project-id:REDACTED";
$canonicalizedResources = "/".$bucket."/";
$stringToSign = utf8_encode("PUT\n\n\n".$timestamp."\n".$version_header."\n".$project_header."\n".$canonicalizedResources);
$signature = base64_encode(hash_hmac("sha1",$stringToSign,$secret_key,true));
$authSignature = $access_id.":".$signature;
$headers = array('Host: '.$bucket.'.commondatastorage.googleapis.com',
'Date: '.$timestamp, $version_header,
$project_header,'Content-Length: 0',
'Authorization: GOOG1 '.$authSignature);
$c = curl_init($url);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c,CURLOPT_HTTPHEADER,$headers);
curl_setopt($c, CURLOPT_PUT, TRUE);
$xml = curl_exec($c);
print($xml);
?>
另外,这里提供了有关谷歌云存储HMAC认证的所有详细信息:谢谢Marc,我已经尝试过了,请求无声地失败了;我没有收到错误响应,也没有创建bucket。我将进一步深入研究文档,看看哪里出了问题。再次感谢您的回复。
<?php
$access_id = "REDACTED";
$secret_key = "REDACTED";
$bucket = "your-bucket";
$url = 'https://'.$bucket.'commondatastorage.googleapis.com';
$timestamp = date("r");
$version_header = "x-goog-api-version:1";
$project_header = "x-goog-project-id:REDACTED";
$canonicalizedResources = "/".$bucket."/";
$stringToSign = utf8_encode("PUT\n\n\n".$timestamp."\n".$version_header."\n".$project_header."\n".$canonicalizedResources);
$signature = base64_encode(hash_hmac("sha1",$stringToSign,$secret_key,true));
$authSignature = $access_id.":".$signature;
$headers = array('Host: '.$bucket.'.commondatastorage.googleapis.com',
'Date: '.$timestamp, $version_header,
$project_header,'Content-Length: 0',
'Authorization: GOOG1 '.$authSignature);
$c = curl_init($url);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c,CURLOPT_HTTPHEADER,$headers);
curl_setopt($c, CURLOPT_PUT, TRUE);
$xml = curl_exec($c);
print($xml);
?>