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,这可能会使与云存储的对话更容易一些。