【发布时间】:2018-01-12 21:00:52
【问题描述】:
谁能帮助弄清楚如何使用 AWS 签名、AWS 凭证和 PHP SDK 3 来访问 API Gateway API?似乎 AWS 签名实际上并未将标头附加到 Guzzle 请求。
这是我的代码:
<?php
require 'vendor/autoload.php';
use Aws\Credentials\Credentials;
use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Request;
use Aws\Signature\SignatureV4;
$access_key = '<access_key>';
$secret_key = '<secret_key>';
$url = 'https://<api-id>.execute-api.us-east-1.amazonaws.com/v1/camel?q=*';
$region = 'us-east-1';
$credentials = new Credentials($access_key, $secret_key);
var_dump($credentials);
$client = new Client();
$request = new Request('GET', $url);
var_dump($request);
$s4 = new SignatureV4("execute-api", $region);
$s4 = new SignatureV4("execute-api", "us-east-1");
$s4->signRequest($request, $credentials);
var_dump($s4);
var_dump($request);
$response = $client->send($request);
我得到的错误是:
( ! ) Fatal error: Uncaught exception
'GuzzleHttp\Exception\ClientException' with message ' in
/path/to/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php on
line 113
( ! ) GuzzleHttp\Exception\ClientException: Client error: `GET
https://<api-id>.execute-api.us-east-1.amazonaws.com/v1/camel?q=*`
resulted in a `403 Forbidden` response: {"message":"Missing
Authentication Token"} in
/path/to/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php on
line 113
Call Stack
# Time Memory Function Location
1 0.0002 234048 {main}( ) ../access.php:0
2 0.2801 486272 GuzzleHttp\Client->send( ) ../access.php:29
3 0.3787 574224 GuzzleHttp\Promise\Promise->wait( ) ../Client.php:106
access.php第29行是:
$response = $client->send($request);
从 var_dumps 中看不到正在添加任何标头。我能够在 API Gateway 和 Postman 中成功测试此端点。启用 CORS 似乎没有什么不同。
有人解决了这个问题吗?
https://forums.aws.amazon.com/post!reply.jspa?messageID=795522 和 https://forums.aws.amazon.com/thread.jspa?messageID=774631&tstart=0 也介绍了此问题,但那里没有解决方案。
【问题讨论】:
-
$s4->signRequest()真的应该在 void 上下文中调用,还是有返回值? -
你是对的,它确实有一个返回值。我没有仔细阅读文档 (docs.aws.amazon.com/aws-sdk-php/v3/api/…)。
-
干得好,解决这个问题只需要建议您从哪里开始寻找。我实际上并不知道答案,但任何时候我看到看起来像丢弃的返回值,这是一个危险信号,表明 something 可能有用的东西正在被丢弃,即使它只是一个真实的/false 通过/失败指示,需要询问其他内容以检索错误消息......或者,在这种情况下,是一个添加了所有签名信息的新请求。
-
你是对的;我应该更加小心。在我的辩护中,似乎 signRequest() 的返回值在 AWS PHP SDK 版本 2 和 3 之间发生了变化。
-
我的评论旨在作为一种恭维,以及对导致我提出您可能忽略的内容的一般思考过程的解释。如果它被视为批评,我深表歉意。
标签: php amazon-web-services aws-sdk aws-api-gateway