Google Storage 使用 Amazon S3 PHP SDK v3 的授权标头不正确


Google Storage Incorrect Authorization Header with Amazon S3 PHP SDK v3

我正在从 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的对话更容易一些。