すべてのプロダクト
Search
ドキュメントセンター

:リクエストの署名について

最終更新日:Mar 20, 2020

ドメイン名

  • 各 API は API グループに属し、各 API グループには一意のドメイン名がつきます。 この独自ドメイン名は、API プロバイダによってバインドされます。 API Gateway は、ドメイン名で API グループを特定します。
  • ドメイン名のフォーマットは www.[独自ドメイン名].com/[Path]?[HTTPMethod] です。
  • API Gateway は、ドメイン名を使用して一意の API グループを特定し、Path と HTTPMethod からこの一意の API を特定します。
  • APIをアプリに権限を付与した後に、コンソールからアプリごとの API ドキュメントと SDK をダウンロードできます。

システム ヘッダー

  • [必須] X-Ca-Key:AppKey
  • [必須] X-Ca-Signature:署名文字列
  • [オプショナル] X-Ca-Timestamp:API 呼び出し元が渡したミリ秒単位のタイムスタンプ、つまり 1970年1月1日から現在のミリ秒までのミリ秒です。 デフォルトでは 15 分間有効です。
  • [オプショナル] X-Ca-Nonce:API 呼び出し元によって生成された UUID です。 このヘッダーは、リプレイ攻撃を防ぐためにタイムスタンプと合わせて使用されます。
  • [オプショナル] Content-MD5:リクエストのボディが Form でない場合、ボディの MD5 値を計算し、その値を API Gateway に送信して確認します。
  • [オプショナル] X-Ca-Stage:リクエストされた API の属するステージです。 TEST(テスト)、PRE(ステージング)、RELEASE(本番) がサポートされています。 デフォルト値は RELEASE(本番) です。

署名の検証

署名計算のデモ (Java) の詳細については、こちら をご参照ください。

署名計算処理は次のとおりです。

署名計算に含まれる文字列を整理します

  1. String stringToSign=
  2. HTTPMethod + "\n" +
  3. Accept + "\n" +
  4. Content-MD5 + "\n"
  5. Content-Type + "\n" +
  6. Date + "\n" +
  7. Headers +
  8. Url

HTTPMethod 値はすべて大文字にする必要があります。

AcceptContent-MD5Content-Typeおよび Date が空の場合にも、改行 (\n) を追加する必要があります。 Headers が空の場合は、改行 (\n) を追加する必要ありません。

Content-MD5

Content-MD5 はボディの MD5 値を示します。 MD5 は、ボディが Form でない場合にのみ計算されます。 計算方法は次のとおりです。

  1. String content-MD5 = Base64.encodeBase64(MD5(bodyStream.getbytes("UTF-8")));

bodyStream はバイト配列を示します。

ヘッダー

ヘッダーは、署名計算に使わるヘッダーの Key、Value を示します。その中で以下のパラメータは署名計算に使われません:X-Ca-Signature、X-Ca-Signature-Headers、Accept、Content-MD5、Content-Type、Date。

ヘッダーの構成方法。

署名計算に使わるすべての Headers の鍵を辞書順にソートし、次の方法で連結します。

  1. String headers =
  2. HeaderKey1 + ":" + HeaderValue1 + "\n"\+
  3. HeaderKey2 + ":" + HeaderValue2 + "\n"\+
  4. ...
  5. HeaderKeyN + ":" + HeaderValueN + "\n"
URL

URL は Path+Query+Body の Form パラメーターを示します。 組み立て方は次のとおりです。

Query+Form の鍵を辞書順に順番を付けし、次の方法で連結します。 Query または Form が空の場合、URL はパスに等しく、疑問符 (?) を追加する必要はありません。

  1. String url =
  2. Path +
  3. "?" +
  4. Key1 + "=" + Value1 +
  5. "&" + Key2 + "=" + Value2 +
  6. ...
  7. "&" + KeyN + "=" + ValueN

Query または Form には複数の値がある可能性があることにご注意ください。 複数の値がある場合は、署名計算に先頭の値を使用します。

署名を計算

  1. Mac hmacSha256 = Mac.getInstance("HmacSHA256");
  2. byte[] keyBytes = secret.getBytes("UTF-8");
  3. hmacSha256.init(new SecretKeySpec(keyBytes, 0, keyBytes.length, "HmacSHA256"));
  4. String sign = new String(Base64.encodeBase64(hmacSha256.doFinal(stringToSign.getBytes("UTF-8")),"UTF-8"));

secret は、アプリの AppSecret です。

署名を引き渡す

計算された署名をリクエストのヘッダーに入れます。 Key は X-Ca-Signature です。

署名計算に関連するすべての Header の Key をコンマで区切り、Request の Header に入れます。 順番は関係ありません。Key は X-Ca-Signature-Headers です。

署名計算のデモの詳細は、こちらをクリックします。