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までの署名について以下サイトがかなりわかりやく記述されてあります。

https://siguniang.wordpress.com/2014/11/23/evolution-of-aws-signing-signatures/

署名有効期限はだいたい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の署名をやっているのがわかります。

https://dev.classmethod.jp/cloud/aws/api-gateway-iam-authentication-sigv4/

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

スポンサーリンク
  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存
スポンサーリンク

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA