Skip to content

x-content-sha256 header typo breaks POST requests through CloudFront OAC (blocks /mobile and /inbox pairing) #4

Description

@shobigrock

現象

docs/setup.md の手順通りにデプロイした直後、html-share review pair <code> を実行すると Request failed になり、ペアリングできません。結果として /mobile/inbox スキルが一切使えない状態でした。

curl で直接 POST https://<consoleDomain>/api/pairings/claim を叩くと、Lambda関数に届く前に CloudFront から以下が返っています。

HTTP/2 403
x-amzn-errortype: InvalidSignatureException

{"message":"The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details."}

ボディなしのPOST(api/device/reviewsのGETなど)は正常に通り、Lambda側のロジックにも問題はありません(AWS SigV4で正しく署名した生リクエストを同じFunction URLへ直接送ると成功します)。ボディ付きのPOST/PUTがCloudFrontのOrigin Access Control(OAC)経由でLambda Function URLへ渡る際にのみ発生します。

原因

CloudFrontのOACでLambda Function URLへ署名付きリクエストを送る場合、ボディを持つPOST/PUTは呼び出し側で x-amz-content-sha256 ヘッダー(ボディのSHA256ハッシュ)を明示的に付与する必要があります(AWS公式ドキュメント)。

src/review-client.tsrequest() 内で、このヘッダーが x-content-sha256 という誤った名前で送られています(amz- が抜けています)。

https://github.com/minorun365/html-share/blob/main/src/review-client.ts#L70

'x-content-sha256': createHash('sha256').update(serialized).digest('hex'),

正しくは

'x-amz-content-sha256': createHash('sha256').update(serialized).digest('hex'),

確認した修正

上記1行を x-amz-content-sha256 に直してビルドし直したところ、review pair / review push / review pull / review complete すべて正常に動作し、/mobile の一連のフロー(ペアリング → カード送信 → スマホでの承認 → 完了)を最後まで確認できました。

再現環境

  • 新規AWSアカウント、リージョン ap-northeast-1(CloudFront証明書のみ us-east-1
  • docs/setup.md 通りに npm installnpm run buildnpm linkkeys init/storenpm run deploy(CDK) でデプロイ
  • Node.js v22.23.1

このIssueはClaude Code(Anthropic製のコーディングエージェント)を使ったセットアップ作業中に発見し、Claude Codeを使って調査・報告しています。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions