API GatewayのAWS_IAMでクエリパラメータにX-Amz-Expiresを追加してURLの認可期限を延ばしたい

API GatewayのAWS_IAMでクエリパラメータにX-Amz-Expiresを追加してURLの認可期限を延ばしたい

API Gatewayの認可でAWS_IAMを指定すると、ヘッダ情報にAuthentication情報を付加する必要があります。

API GatewayのAWS_IAMでクエリパラメータにX-Amz-Expiresを追加してURLの認可期限を延ばす

ヘッダ情報を付けずにそのままAPIを叩くと403Forbiddenエラー(Missing Authentication Token)となります。

必要なヘッダ情報は以下3つです。

header
host xxx.execute-api.リージョン.amazonaws.com
X-Amz-Date yyyyMMddT105852Z(ISO8601形式)
Authorization AWS4-HMAC-SHA256 Credential=アクセスキー/yyyyMMdd/リージョン/execute-api/aws4_request, SignedHeaders=host;x-amz-date, Signature=zzz

hostで指定するのはAPIのドメインです。

X-Amz-Dateで指定するのは日付(ISO8601形式)です。

Authorizationで指定するのは上の通りです。SignatureはSigV4という署名になります。

V1~V4までの署名について以下サイトがかなりわかりやく記述されてあります。

AWS REST リクエストの署名についてメモ
AWS の REST API のリクエストでは署名(signature)を使って、API のセキュリティチェックを行っている。 サービス開始時に Version 1(いまは使われていない) が公開されたあと、2, 3, 4 という合計4種類...

署名有効期限はだいたい5分

有効期限はどうも5分のようです。5分を過ぎてAPIを叩くと以下のようなエラーが出ます。


Signature expired: 20200219T105852Z is now earlier than 20200219T110350Z (20200219T110850Z – 5 min.)

view raw

gistfile1.txt

hosted with ❤ by GitHub

ヘッダ情報に付加している情報を削除し、全てクエリパラメータにすることによってX-Amz-expiresが効くかどうかを検証してみました。(POSTでヘッダ情報を空にして、クエリパラメータを付加してあげます。ヘッダとクエリパラメータの混同はエラーとなります。)

必要なパラメータは以下となります。

クエリパラメータ
X-Amz-Date 20200219T105852Z(ISO8601形式)
X-Amz-Algorithm AWS4-HMAC-SHA256
X-Amz-Credential アクセスキー/yyyyMMdd/リージョン/execute-api/aws4_request
X-Amz-SignedHeaders host;x-amz-date
X-Amz-Signature zzz

上記情報にX-Amz-Expiresを秒指定で追加します。

結論としては、X-Amz-Expiresは効きません。

署名については再利用するのではなく、API リクエストの都度その時点の日時を用いて生成をする必要があるようです。

Signatureの計算

自前でするのは面倒なので、以下サイトのindex.jsが簡単に吐いてくれます。非公開メソッドを使用しているようです。

aws-sdk\lib\signers\v4.jsやaws-sdk\lib\signers\v4_credentials.jsを見たらこのクソ難しいsigv4の署名をやっているのがわかります。

API GatewayでAPIにIAM認証をかけて、Node.jsでSigV4署名ヘッダを作成してリクエストしてみる | DevelopersIO

とにかく署名のロジックは面倒なので、aws-signature-v4モジュールを使うとかもありです。

コメント

株式会社CONFRAGE ITソリューション事業部をもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

タイトルとURLをコピーしました