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
hostxxx.execute-api.リージョン.amazonaws.com
X-Amz-DateyyyyMMddT105852Z(ISO8601形式)
AuthorizationAWS4-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種類が存在する。 この署名の仕様をメモ。 version 1 最も古い Versio...

署名有効期限はだいたい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-Date20200219T105852Z(ISO8601形式)
X-Amz-AlgorithmAWS4-HMAC-SHA256
X-Amz-Credentialアクセスキー/yyyyMMdd/リージョン/execute-api/aws4_request
X-Amz-SignedHeadershost;x-amz-date
X-Amz-Signaturezzz

上記情報に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
CX事業本部の佐藤です。 API GatewayでIAM認証を設定して、Node.jsでSigV4署名を実装する機会がありましたので、知見としてまとめます。 API Gatewayの認証方式 まずは、API Gatewa …

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

コメント

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