小编Aze*_*pas的帖子

签署我的请求时我做错了什么?AWS SignatureV4 和 PHP

我已经被这个问题困了两天了。我编写了一个 Python 脚本,它向 AWS Pinpoint 服务发出 PUT 请求。与许多其他 AWS 服务一样,Pinpoint 需要对请求进行签名验证,我设法在 Python 中处理了这一点。

现在我正在尝试将我的脚本翻译成 Symfony 的 PHP 服务。当我向 AWS pinpoint 运行我的第一个请求时,我得到以下信息:

我们计算的请求签名与您提供的签名不匹配。检查您的 AWS 秘密访问密钥和签名方法。有关详细信息,请参阅服务文档。 此请求的规范字符串应该是\n'PUT\n/v1/apps/.../endpoints/...\n\ncontent-type:application/json\nhost:pinpoint.eu-west-1。 amazonaws.com\nx-amz-content-sha256:de98d86577f0e1...655e6de27154af1c05ab34\nx-amz-date:20191226T151542Z\nx-amz-security-token:IQoJ-agent...放大/1.1.2 反应原生 aws-amplify/1.1.2 反应原生回调\n\ncontent-type;host;x-amz-content-sha256;x-amz-date;x-amz-security-token; x-amz-user-agent\n0240a9479d0a66d74eaae42dc...95247aaa800fcbe5cf2

String-to-Sign 应该是 'AWS4-HMAC-SHA256\n20191226T151542Z\n20191226/eu-west-1/mobiletargeting/aws4_request\nb2c451534fe370503ecf4068b4912803e20191226T151542Z

所以我已经检查过我的规范字符串是否错误,这与 AWS 要求的完全相同。String-to-Sign 与 Canonical String 哈希不同。

这是我的标题功能

public function create_headers($data,\DateTime $time,$canonical_uri,$method,$to_api=null)
    {
        $amz_date = $time->format('Ymd\THis\Z');
        $date_stamp = $time->format('Ymd');
        $payload_hash = hash('sha256',$data);#utf8_encode($data));
        $canonical_querystring = "";
        $canonical_headers = 'content-type:' . $this->content_type . '\n' . 'host:' . $this->host . '\n' . 'x-amz-content-sha256:' . $payload_hash . '\n' . …
Run Code Online (Sandbox Code Playgroud)

php request signature amazon-web-services

2
推荐指数
1
解决办法
1014
查看次数

标签 统计

amazon-web-services ×1

php ×1

request ×1

signature ×1