Получение 403 запрещено с использованием AWS PHP SDK для выполнения API Gateway getConnection или postToConnection (работает в Postman) - PullRequest
0 голосов
/ 25 мая 2020

Я пытаюсь написать код PHP для отправки сообщения на AWS API-шлюз, используя AWS SDK. Это код, который я написал (с поддельными учетными данными вместо настоящих, конечно, исключительно для этого вопроса):

require_once('/aws/aws-autoloader.php');

$credentials = new Aws\Credentials\Credentials('AWSACCESSKEY', 'AWSSECRETKEYGOESHERE');
$client = new \Aws\ApiGatewayManagementApi\ApiGatewayManagementApiClient([
    'endpoint'    => 'https://q1w2e3r4t5y.execute-api.us-east-1.amazonaws.com/testing',
    'version'     => 'latest',
    'region'      => 'us-east-1',
    'credentials' => $credentials
]);
$val = $client->postToConnection(array('ConnectionId' => 'NC0nN3cT10N1d=', 'Data' => 'Hello World'));
var_dump($val);

Но когда я выполняю этот код, я получаю эту ошибку в своих журналах:

2020/05/25 16:14:14 [error] 19787#19787: *20652052 FastCGI sent in stderr: "PHP message: PHP Fatal 
error:  Uncaught exception 'Aws\ApiGatewayManagementApi\Exception\ApiGatewayManagementApiException' 
with message 'Error executing "PostToConnection" on 
"https://q1w2e3r4t5y.execute-api.us-east-1.amazonaws.com/@connections/NC0nN3cT10N1d%3D"; 
AWS HTTP error: Client error: `POST 
https://q1w2e3r4t5y.execute-api.us-east-1.amazonaws.com/@connections/NC0nN3cT10N1d%3D` 
resulted in a `403 Forbidden` response:
{"message":"Forbidden"}
ForbiddenException (client): Forbidden - {"message":"Forbidden"}'
GuzzleHttp\Exception\ClientException: Client error: `POST 
https://q1w2e3r4t5y.execute-api.us-east-1.amazonaws.com/@connections/NC0nN3cT10N1d%3D` 
resulted in a `403 Forbidden` response:
{"message":"Forbidden"}
 in /var/www/html/project/aws/GuzzleHttp/Exception/RequestException.php:113
Stack trace:
#0 /var/www/html/project/aws/GuzzleHttp/Middleware.php(65): 
GuzzleHttp\Exception\RequestException::create(Object(GuzzleHttp\Psr7\Request), 
Object(GuzzleHttp\Psr7\Response))
#1 /var/w" while reading response header from upstream, client: 172.31.39.215, server: example.com, 
request: "GET /tmp/debug.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/php/php7.2-fpm.sock:", 
host: "example.com"

Вот те же настройки, которые успешно использовались в Postman: enter image description here

Когда я отправляю это в Postman, я получаю 200 OK и вижу все Я вставил тело в свой слушатель веб-сокета (я использую это Chrome расширение для создания и прослушивания соединения: простой клиент WebSocket ).

Итак, я знаю IAM учетные данные пользователя верны, но по какой-то причине похоже, что AWS PHP SDK не подписывает запрос правильно. Если я удалю вызов postToConnection, я НЕ получаю сообщение об ошибке, поэтому я знаю, что он не дает сбой при создании самого клиента.

Что мне не хватает? Почему это работает в Postman, а не в AWS PHP SDK?

1 Ответ

0 голосов
/ 26 мая 2020

Проблема заключалась в том, что конечная точка должна заканчиваться завершающим / после этапа.

Таким образом, эта строка PHP:

'endpoint'    => 'https://q1w2e3r4t5y.execute-api.us-east-1.amazonaws.com/testing',

становится

'endpoint'    => 'https://q1w2e3r4t5y.execute-api.us-east-1.amazonaws.com/testing/',

Вот и все.

Урок: Черт возьми, сообщения об ошибках AWS ужасны ...

...