概要

Synthetic モニタリングでは、JavaScript のスクリプトから変数を生成できるので、カスタム認証を定義したり、パラメーターをエンコードしたりすることができます。

HMAC 認証を使用した HTTP テスト

このガイドでは、スクリプトの変数を使用して、HMAC 署名付きの HTTP テストを作成する方法を説明します。

注: 標準的な HMAC 認証というものは存在しないため、独自の HMAC 認証は多少異なる場合があります。例えば、異なるヘッダー名を使用する場合があります。

セットアップ

ローカル変数を使って HMAC 認証の構成要素を作成する

Synthetic HTTP テストを作成し、Create a Local Variable をクリックして、以下の変数を追加します。

MY_SECRET_KEY
メッセージに署名するために使用される UTF-8 エンコードされたキー(global variableからインポートすることもできます)。
BODY
リクエストの本文 (Request Body に設定) で、HMAC 認証の計算処理に使用されます。
DATETIME
HMAC 署名を計算するためのパラメーター。これは ローカル変数 として作成するか、variable from script script 内で dd.variable.set('DATETIME', new Date().toISOString()) を使用して作成およびエクスポートすることができます。

テスト用のURLとリクエスト本文を定義します

HTTP テストの URL とリクエストタイプを定義します。次に、Advanced Options > Request Body をクリックして、 を追加します。{{ BODY }} 変数をリクエスト本文として使用します。

HTTP テストのリクエスト本文として設定されたローカル変数

JavaScript で HMAC 署名を計算する

Variable From Script をクリックして、HTTP リクエストの HMAC 署名を生成します。

JavaScript で生成されたローカル変数

このスクリプトは、Datadog が HTTP リクエストを送信する前に実行されます。リクエスト完了後に JSON レスポンスデータを検証するには、JavaScript アサーションと dd.response.body を使用します。

  • スクリプトに変数をインポートするには、dd.variable.get("<variable_name>") を使用します。
  • 変数を定義するには、dd.variable.set("<variable_name>", <value>) または dd.variable.setObfuscated("<variable_name>", <value>) を使用します。

また、以下のようなヘルパー関数にもアクセス可能です。

  • std ライブラリ の大部分は、std.* でアクセスできます。例えば、encodeHexで定義された関数 @std/encoding/hex.ts を呼び出すには、std.encoding.hex.encodeHex を使用します。
  • Web Crypto API などの標準的な JavaScript API。

注: これらの API の一部はセキュリティ上の理由で無効になっています。

例:

Variable from Script

const datetime = new Date().toISOString();
// Set a "date" HTTP header using DATETIME as its value in the UI
dd.variable.set("DATETIME", datetime);

const message = "Hello, World!";
// Use BODY as the request body in the UI
dd.variable.set("BODY", message);

const secretKeyUtf8 = dd.variable.get("MY_SECRET_KEY");
const key = await crypto.subtle.importKey(
  "raw",
  new TextEncoder().encode(secretKeyUtf8),
  { name: "HMAC", hash: "SHA-256" },
  false,
  ["sign"]
);

const rawSignature = await crypto.subtle.sign(
  { name: "HMAC" },
  key,
  new TextEncoder().encode(datetime + "." + message)
);

// Set an "authentication" HTTP header using SIGNATURE as its value in the UI
dd.variable.set("SIGNATURE", std.encoding.hex.encodeHex(rawSignature));

// Alternative:
dd.variable.set("SIGNATURE_BASE64", std.encoding.base64.encode(rawSignature));

リクエストヘッダーに HMAC 署名を追加する

エクスポートされた SIGNATURE 変数を使用して、HTTP リクエストヘッダーを構築します。

Request Options タブで、Name を Authentication に、Value を に設定したヘッダーを追加します。{{ SIGNATURE }}, and another one with Name を Date and Value を に設定します。{{ DATETIME }}. You can define a different header such as Authorization。

HTTP テストの残りの部分を構成し、Create をクリックして保存します。

参考資料