Skip to content

fix: ブラウザからの POST リクエストに x-amz-content-sha256 ヘッダーを付与する - #24

Open
nssv0084 wants to merge 1 commit into
minorun365:mainfrom
nssv0084:fix/add-x-amz-content-sha256-for-browser-post
Open

nssv0084 wants to merge 1 commit into
minorun365:mainfrom
nssv0084:fix/add-x-amz-content-sha256-for-browser-post

Conversation

@nssv0084

@nssv0084 nssv0084 commented Sep 10, 2026

Copy link
Copy Markdown

問題

ダッシュボードから共有URLを発行しようとすると POST /api/owner/shares が HTTP 403 (InvalidSignatureException) で失敗する。

原因

CloudFront OAC は Lambda Function URL へのリクエストを Sig V4 で署名する際、ペイロードハッシュの値として x-amz-content-sha256 ヘッダーを参照する。このヘッダーがない場合、ボディありの POST に対して正しい署名を生成できず 403 が返る。

GETリクエストやボディなしの POST は問題なく通るが、ボディありの POST のみ失敗するのはこのためで、CloudFront OAC の既知の挙動です。

#4 との関係

#4 では src/review-client.ts(CLIパス)に同じ修正が入っていますが、ブラウザ側(web/app/index.html および web/mobile-page-shell.js)には適用されていませんでした。本PRはその対応です。

ブラウザ環境では Node.js の createHash が使えないため、Web Crypto API(crypto.subtle.digest)で SHA-256 ハッシュを計算しています。

修正内容

  • web/app/index.htmlbuildTimedShareUrl 内の fetch に x-amz-content-sha256 を追加
  • web/mobile-page-shell.js — 共有URL発行処理の fetch に同ヘッダーを追加

検証

OAC + authType: AWS_IAM の構成で実際にデプロイした環境にて、修正後に POST /api/owner/shares が 201 で正常に完了し、共有URLが発行できることを確認済みです。Claude Code を使って根本原因を調査・特定し、この修正に至りました。

…udFront OAC

CloudFront OAC (Origin Access Control) requires the x-amz-content-sha256 header
to be present when forwarding POST requests with a body to Lambda Function URLs
using AWS_IAM auth. Without it, CloudFront cannot include the correct payload hash
in its Sig V4 signature, causing an InvalidSignatureException (HTTP 403).

This is the browser-side counterpart of the CLI fix in src/review-client.ts (issue minorun365#4).
The body hash is computed using the Web Crypto API (crypto.subtle.digest) which is
available in all modern browsers.

Fixes: POST /api/owner/shares returning 403 when using the dashboard to generate share URLs.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant