Google 使用 Amazon S3 PHP SDK v3 的存储授权不正确 Header
Google Storage Incorrect Authorization Header with Amazon S3 PHP SDK v3
我正在从 Amazon S3 迁移到 Google 存储,但我似乎无法使用我的凭据。下面是我用来测试我的凭据的一些示例代码:
$client = new S3Client([
'credentials' => [
'key' => 'GOOGxxxxxxxxxxxxxxx',
'secret' => 'ZfcOTxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
],
'region' => 'US',
'version' => 'latest',
'endpoint' => 'https://storage.googleapis.com',
]);
try {
$result = $client->putObject(array(
'Bucket' => 'devtest',
'Key' => 'test',
'Body' => 'Hello world'
));
echo $result['ObjectURL'];
} catch (\Aws\S3\Exception\S3Exception $e) {
// The AWS error code (e.g., )
echo $e->getAwsErrorCode() . "\n";
// The bucket couldn't be created
echo $e->getMessage() . "\n";
}
这是我得到的结果:
InvalidSecurity Error executing "PutObject" on "https://storage.googleapis.com/devtest/test"; AWS HTTP error: Client error response [url] https://storage.googleapis.com/devtest/test [status code] 403 [reason phrase] Forbidden InvalidSecurity (client): The provided security credentials are not valid. - InvalidSecurityThe provided security credentials are not valid.
Incorrect Authorization header
我已经尝试用谷歌搜索这个问题的 100 种不同组合,但找不到任何东西。我启用了互操作性,至少我认为我启用了,因为我认为如果不先启用它我就无法获得 key/secret。我启用了 Google 存储 API。
如有任何帮助,我们将不胜感激。
编辑:这是身份验证 Header 以防有帮助:
AWS4-HMAC-SHA256
Credential=GOOGGUxxxxxxxxxxx/20150611/US/s3/aws4_request,
SignedHeaders=host;x-amz-content-sha256;x-amz-date,
Signature=9c7de4xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
我注意到即使我指定 'signature' => 'v2',它也会保持 "aws4_request"。不确定这是否重要。
我查看了 S3Client 代码,据我所知它没有使用 'signature' 配置键。我发现的唯一东西是 'signature_version',当设置为 v2 时,我得到这个错误:
Unable to resolve a signature for v2/s3/US. Valid signature versions include v4 and anonymous.
我正在使用 Laravel 5.1 和 composer 包 aws/aws-sdk-php 版本 3.0.3
有什么想法吗?
S3 仅支持 v4 签名,此要求由 PHP SDK 强制执行。 Google Cloud Storage 似乎只支持 v2 签名,因此您无法使用同一个库与两者通信。 Google 确实提供了他们自己的 PHP SDK,这可能会使与云存储的对话更容易一些。
我正在从 Amazon S3 迁移到 Google 存储,但我似乎无法使用我的凭据。下面是我用来测试我的凭据的一些示例代码:
$client = new S3Client([
'credentials' => [
'key' => 'GOOGxxxxxxxxxxxxxxx',
'secret' => 'ZfcOTxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
],
'region' => 'US',
'version' => 'latest',
'endpoint' => 'https://storage.googleapis.com',
]);
try {
$result = $client->putObject(array(
'Bucket' => 'devtest',
'Key' => 'test',
'Body' => 'Hello world'
));
echo $result['ObjectURL'];
} catch (\Aws\S3\Exception\S3Exception $e) {
// The AWS error code (e.g., )
echo $e->getAwsErrorCode() . "\n";
// The bucket couldn't be created
echo $e->getMessage() . "\n";
}
这是我得到的结果:
InvalidSecurity Error executing "PutObject" on "https://storage.googleapis.com/devtest/test"; AWS HTTP error: Client error response [url] https://storage.googleapis.com/devtest/test [status code] 403 [reason phrase] Forbidden InvalidSecurity (client): The provided security credentials are not valid. - InvalidSecurityThe provided security credentials are not valid. Incorrect Authorization header
我已经尝试用谷歌搜索这个问题的 100 种不同组合,但找不到任何东西。我启用了互操作性,至少我认为我启用了,因为我认为如果不先启用它我就无法获得 key/secret。我启用了 Google 存储 API。
如有任何帮助,我们将不胜感激。
编辑:这是身份验证 Header 以防有帮助:
AWS4-HMAC-SHA256 Credential=GOOGGUxxxxxxxxxxx/20150611/US/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=9c7de4xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
我注意到即使我指定 'signature' => 'v2',它也会保持 "aws4_request"。不确定这是否重要。
我查看了 S3Client 代码,据我所知它没有使用 'signature' 配置键。我发现的唯一东西是 'signature_version',当设置为 v2 时,我得到这个错误:
Unable to resolve a signature for v2/s3/US. Valid signature versions include v4 and anonymous.
我正在使用 Laravel 5.1 和 composer 包 aws/aws-sdk-php 版本 3.0.3
有什么想法吗?
S3 仅支持 v4 签名,此要求由 PHP SDK 强制执行。 Google Cloud Storage 似乎只支持 v2 签名,因此您无法使用同一个库与两者通信。 Google 确实提供了他们自己的 PHP SDK,这可能会使与云存储的对话更容易一些。