Webhook ドキュメント
Webhook は、LMS プラットフォーム内で発生したイベント(学習進捗更新、テスト結果、RAG インデックス更新など) を外部システムにリアルタイムで通知する仕組みです。 自社システムやデータレイク、Teams Bot などと連携するために利用します。
1. Webhook の基本仕様
- リクエスト形式: HTTP POST
- Content-Type: application/json
- 再送: 最大 3 回のリトライ(5秒間隔)
- 署名付き(HMAC-SHA256) による検証に対応
Webhook は非同期で送信され、イベント発火順に配信が保証されます(同一ユーザー・同一プロジェクト内)。
2. セキュリティ(署名検証)
すべての Webhook リクエストには X-LMS-Signature ヘッダーが付与されます。
X-LMS-Signature: sha256=abcdef123456...
署名は以下の式で生成されています:
signature = HMAC_SHA256(webhook_secret, request_body)
■ C#(署名検証コード例)
var secret = "your_webhook_secret";
var body = await new StreamReader(Request.Body).ReadToEndAsync();
using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secret));
var computed = hmac.ComputeHash(Encoding.UTF8.GetBytes(body));
var computedHex = BitConverter.ToString(computed).Replace("-", "").ToLower();
var signature = Request.Headers["X-LMS-Signature"].ToString().Replace("sha256=", "");
if (computedHex != signature)
{
return Unauthorized();
}
3. Webhook イベント一覧
| イベント | 説明 |
|---|---|
| user.progress.updated | ユーザーの学習進捗が更新された |
| user.test.completed | テスト・クイズを完了した |
| curriculum.course.updated | コース内容が更新された |
| rag.index.rebuilt | RAG インデックスが再構築された |
| rag.crawl.completed | クローラーがデータ取得を完了した |
| admin.user.created | 新規ユーザーが作成された |
4. Webhook 受信例
■ user.progress.updated
{
"event": "user.progress.updated",
"timestamp": "2025-03-01T12:40:00Z",
"data": {
"userId": "USR-1034",
"courseId": "CRS-AI-101",
"progress": 68,
"updatedBy": "yamada@company.com"
}
}
■ rag.index.rebuilt
{
"event": "rag.index.rebuilt",
"timestamp": "2025-03-01T09:10:15Z",
"data": {
"indexId": "IDX-2025-02-28",
"documentsIndexed": 4321,
"duration": "83 seconds",
"status": "success"
}
}
5. リトライ仕様
- 200 OK を返した場合 → 配信成功
- 200 以外 → 5秒間隔で最大 3 回リトライ
- 3 回失敗 → Dead-letter リストに保存(管理画面で確認可能)
6. 受信エンドポイントの要件
Webhook 受信サーバーは以下を満たす必要があります。
- HTTPS を必須
- POST メソッドのみ
- Content-Type: application/json に対応
- 署名検証を実装することが推奨
7. テスト送信(管理画面)
RAG 管理者画面 / 管理者画面から テスト Webhook 送信 を実行できます。 本番イベントを待たずに接続確認できます。