API GatewayのAWS_IAMでクエリパラメータにX-Amz-Expiresを追加してURLの認可期限を延ばしたい
API Gatewayの認可でAWS_IAMを指定すると、ヘッダ情報にAuthentication
情報を付加する必要があります。
ヘッダ情報を付けずにそのまま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までの署名について以下サイトがかなりわかりやく記述されてあります。
署名有効期限はだいたい5分
有効期限はどうも5分のようです。5分を過ぎてAPIを叩くと以下のようなエラーが出ます。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Signature expired: 20200219T105852Z is now earlier than 20200219T110350Z (20200219T110850Z – 5 min.) |
ヘッダ情報に付加している情報を削除し、全てクエリパラメータにすることによって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の署名をやっているのがわかります。
とにかく署名のロジックは面倒なので、aws-signature-v4モジュールを使うとかもありです。
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント