我正在从 Amazon S3 迁移到 Google Storage,但我似乎无法让我的凭据正常工作。下面是我整理的一些示例代码,用于测试我的凭据:
$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";
}
这是我得到的
:无效安全错误在"https://storage.googleapis.com/devtest/test"上执行"放置对象";AWS HTTP 错误:客户端错误响应 [url] https://storage.googleapis.com/devtest/test [状态代码] 403 [原因短语] 禁止的无效安全性(客户端):提供的安全凭证无效。- 无效安全提供的安全凭据无效。 授权标头不正确
我尝试在谷歌上搜索这个问题的 100 种不同组合,但找不到任何东西。我启用了互操作性,至少我认为我启用了互操作性,因为我认为如果不先启用密钥/机密,我就无法获得密钥/机密。我启用了谷歌存储API。
任何帮助将不胜感激。
编辑:这是身份验证标头,以防有帮助:
我AWS4-HMAC-SHA256 Credential=GOOGGUxx/20150611/US/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, 签名=9c7de4xx
注意到即使我指定"签名"=>"v2",它也会保持"aws4_request"。不确定这是否重要。
我看了一下S3Client代码,据我所知,它没有使用"签名"配置键。我唯一发现的是"signature_version",当设置为 v2 时,我收到此错误:
无法解析 v2/s3/US 的签名。有效的签名版本包括 v4 和匿名。
我正在使用带有作曲家包aws/aws-sdk-php版本3.0.3的Laravel 5.1
有什么想法吗?
S3 仅支持 v4 签名,此要求由 PHP SDK 强制执行。似乎Google Cloud Storage仅支持v2签名,因此您将无法使用同一库与两者进行通信。谷歌确实提供了自己的PHP SDK,这可能会使与Cloud Storage的对话更容易一些。