【问题标题】:Google Storage Incorrect Authorization Header with Amazon S3 PHP SDK v3使用 Amazon S3 PHP SDK v3 的 Google Storage 授权标头不正确
【发布时间】: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


【解决方案1】:

S3 仅支持 v4 签名,此要求由 PHP SDK 强制执行。 Google Cloud Storage 似乎只支持 v2 签名,因此您将无法使用同一个库与两者进行对话。 Google 确实提供了自己的 PHP SDK,这可能会使与 Cloud Storage 的对话更容易一些。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多