API & Webhook重要度: 緊急 (CRITICAL)
401 Unauthorized: HMAC SHA256 Verification Failed

Shopify Webhook HMAC署名検証エラーの解決策

注文作成(orders/create)や在庫変更(inventory_levels/update)のWebhookを自社サーバーで受信する際に発生。

エラー根本原因 & クイック解決サマリー

2026年最新API仕様

リクエストボディをJSONとしてパースする前に、生のBuffer/Stringとして保持する。

Node.js cryptoモジュール(createHmac('sha256'))で正しくダイジェストを計算し、timingSafeEqualで比較する。

📋 主要スペック & 決定ファクトシート

エラーコード
401 Unauthorized
重要度レベル
緊急 (CRITICAL)
推奨解決コード
TYPESCRIPT

根本原因(Root Cause)

Webhookリクエストのraw body(生のバイナリ文字列)を取得する前にJSON.parse等のミドルウェアが本文をパース・改変してしまい、Shopifyが送信したハッシュ値と一致しなくなる。

放置した場合のビジネス影響

Webhookエンドポイントが第三者からの不正リクエストに対して無防備になり、偽の注文情報や不正データの混入リスクが生じます。

推奨解決コード実装例(TYPESCRIPT)

timingSafeEqual を使用することでタイミング攻撃脆弱性を防ぎ、セキュアに署名検証を行います。

✔ 正しい修正コード(推奨実装)
import crypto from 'crypto';

export function verifyShopifyWebhook(rawBody: string | Buffer, hmacHeader: string, secretKey: string): boolean {
  const calculatedHmac = crypto
    .createHmac('sha256', secretKey)
    .update(rawBody)
    .digest('base64');

  try {
    return crypto.timingSafeEqual(
      Buffer.from(calculatedHmac),
      Buffer.from(hmacHeader)
    );
  } catch {
    return false;
  }
}

エラー対応に関するFAQ

QNext.js App RouterのRoute Handlerでraw bodyを取得するにはどうすればいいですか?

req.text() または req.arrayBuffer() を使用して、JSON変換前に生データを直接読み込みます。

他の技術エラー逆引きガイド

E-E-A-T 技術検証・執筆基準

Shopify Plus Partner 監修

本ページの情報は、国内200社以上のShopify公開開発実績およびShopify公式技術ドキュメント(2026 Edition)に基づき、Shopifyエラー・APIトラブルシューティングの実装実務経験を持つシニアShopifyアーキテクトが検証・執筆しています。

最終検証更新
2026年3月
完全無料・登録不要ですぐに算出

技術トラブルの解決・リファクタリングを1分で試算

APIレートリミット対策、Webhook耐障害性の向上、Functions開発の工数・費用を即座に出力できます。