2017-08-04 173 views
0

任何人都可以幫助解決如何使用AWS Signature,AWS Credentials和PHP SDK 3訪問API網關API嗎?看起來AWS簽名實際上並未將標題附加到Guzzle請求。如何使用PHP SDK從AWS API網關訪問API 3

這裏是我的代碼:

<?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); 

一點也沒有」 t從var_dumps中顯示任何頭文件正在被添加。我能夠在API網關和Postman中成功測試此端點。啓用CORS似乎沒有什麼區別。

有沒有人解決過這個問題呢?

此問題在https://forums.aws.amazon.com/post!reply.jspa?messageID=795522https://forums.aws.amazon.com/thread.jspa?messageID=774631&tstart=0也涵蓋,但這裏沒有解決方案。

+0

'$ s4-> signRequest()'真的應該在void上下文中調用,還是它有返回值? –

+0

你是對的,它確實有回報價值。我沒有仔細閱讀文檔(http://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.Signature.SignatureV4.html#_signRequest)。 – pzzd

+0

不錯的工作,解決這個問題只不過是你可能想要開始尋找的地方。實際上我並沒有真正知道答案,但是無論何時我看到看起來像是一個丟棄的返回值,這是一個紅色的標誌,即*可能有用的東西將被丟棄,即使它只是一個真/假通過/失敗表示需要詢問別的東西來檢索錯誤消息......或者在這種情況下,添加所有簽名信息的新請求。 –

回答

1

謝謝,邁克爾,爲您提供以上幫助。

您必須使用新的SignatureV4返回,這是一個修改後的響應。

$s4 = new SignatureV4("execute-api", $region); 
$signedrequest = $s4->signRequest($request, $credentials); 

$response = $client->send($signedrequest); 

echo $response->getBody();