【发布时间】:2015-08-26 12:09:39
【问题描述】:
我正在从 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”上执行“PutObject”时出现 InvalidSecurity 错误; AWS HTTP 错误:客户端错误响应 [url] https://storage.googleapis.com/devtest/test [状态码] 403 [原因短语] Forbidden InvalidSecurity(客户端):提供的安全凭证无效。 - InvalidSecurity 提供的安全凭证无效。 授权标头不正确
我已尝试用谷歌搜索此问题的 100 种不同组合,但找不到任何东西。我启用了互操作性,至少我认为我这样做了,因为我认为如果不先启用它就无法获得密钥/秘密。而且我启用了 Google Storage API。
任何帮助将不胜感激。
编辑:这是身份验证标头以防万一:
AWS4-HMAC-SHA256 凭证=GOOGGUxxxxxxxxxxx/20150611/US/s3/aws4_request, SignedHeaders=主机;x-amz-content-sha256;x-amz-date, 签名=9c7de4xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
我注意到即使我指定 'signature' => 'v2',它仍然保持“aws4_request”。不确定这是否重要。
我查看了 S3Client 代码,据我所知,它没有使用“签名”配置键。我发现的唯一一件事是“signature_version”,当设置为 v2 时,我收到此错误:
无法解析 v2/s3/US 的签名。有效的签名版本包括 v4 和匿名。
我正在使用 Laravel 5.1 和 composer 包 aws/aws-sdk-php 版本 3.0.3
有什么想法吗?
【问题讨论】:
-
为了消除客户端代码以某种方式使有效凭据无效的可能性,您可以尝试在 gsutil 配置文件中使用您的密钥和秘密,看看您是否可以使用这些凭据执行 gsutil 操作?另外,您是否以这种方式创建了 HMAC 凭据? cloud.google.com/storage/docs/migrating#keys
-
也许
signature => 'v2'在构造函数中?谷歌似乎没有实现 v4,你可能默认了。错误的措辞表明 auth 标头的格式无效,而不是签名不匹配。 -
@MikeSchwartz 是的,我通过互操作性创建了我的凭据。是的,当我使用 gsutil 时它们可以工作。我可以运行“gsutil ls gs://devtest”,它会正确列出存储桶中的文件。我在帖子中添加了一些附加信息。任何帮助将不胜感激。
-
@Michael-sqlbot 我试过了,但我认为该配置实际上不再使用了。我更新了我的帖子,提供了有关 Auth 标头的更多信息。
-
我怀疑这与 PHP SDK 在线生成凭据的方式有关。当 GCS 收到的凭证既不是 AWS 也不是 GOOG1 凭证时,就会出现该错误消息。我建议运行 gsutil -D ls 并查看它发送的授权标头;然后捕获 PHP SDK 发送的 Authorization 标头,并比较它们。我看到 gsutil 发送的凭据如下: Authorization: GOOG1 GOOG<...>
标签: php google-app-engine amazon-web-services amazon-s3 google-cloud-storage