メインコンテンツへスキップ
Diditが750万ドルを調達、本人確認と不正対策のインフラを構築
Didit
ブログ一覧へ
ブログ2026年3月6日

Goで本人確認イベント用Webhookハンドラーを構築する (JA)

本人確認イベントに対応する堅牢なWebhookハンドラーをGoで構築する方法を学びましょう。このガイドでは、HTTPサーバーのセットアップ、JSONペイロードの処理、リトライ処理、および検証のセキュリティ確保について説明します。.

By Didit更新日
build-go-webhook-handler-identity-verification.png

リアルタイム自動化Webhookは、本人確認の結果に対する即時のイベント駆動型応答を可能にし、動的なユーザーオンボーディングや不正防止システムにとって不可欠です。

堅牢なエラー処理非同期Webhookイベントを処理する際、データの整合性とシステムの信頼性を維持するためには、リトライメカニズム、デッドレターキュー、および包括的なロギングの実装が不可欠です。

セキュリティが最重要改ざんや不正アクセスから保護し、機密性の高い本人確認情報を守るため、常にWebhook署名を検証し、HTTPSを使用し、受信データをサニタイズしてください。

Diditによる統合の簡素化Diditのモジュール式APIファーストプラットフォームは、包括的なWebhookサポートを提供し、開発者がID検証からAMLスクリーニングまで、すべての本人確認イベントに対するリアルタイム通知を無料で簡単に設定できるようにします。

デジタルアイデンティティの現代において、リアルタイムのフィードバックは単なる贅沢品ではなく、必需品です。新規ユーザーのオンボーディング、不正防止、コンプライアンスの確保など、本人確認チェックの結果が発生した瞬間にそれを知ることで、即座のアクションとよりスムーズなユーザーエクスペリエンスが可能になります。ここでWebhookが輝きます。Webhookは、本人確認プラットフォームがイベント発生時にアプリケーションに通知するための強力なメカニズムを提供し、継続的なポーリングの必要性を排除します。

このブログ記事では、Goで堅牢で安全なWebhookハンドラーを構築する方法を、特に本人確認イベントの処理に特化して解説します。Goの強力な並行処理機能とパフォーマンスは、Webhookの非同期的な性質を処理するのに優れた選択肢です。

本人確認におけるWebhookの理解

コードに入る前に、Webhookとは何か、そしてなぜ本人確認にとって重要なのかを明確にしましょう。Webhookは本質的にユーザー定義のHTTPコールバックです。アプリケーションが本人確認サービスに更新を継続的に問い合わせる(ポーリングする)代わりに、特定のイベントが発生するたびに、サービスはあなたが提供するURLにHTTP POSTリクエストを送信します。本人確認の場合、これらのイベントには以下が含まれます。

  • ユーザーのID書類のスキャンが完了した。
  • 生体認証が合格または不合格になった。
  • AMLスクリーニングが一致を返した。
  • 完全な検証ワークフローが最終ステータス(例:承認、拒否、手動レビュー)に達した。

これらのイベントをリアルタイムで受信することで、アプリケーションはユーザーのステータスを更新したり、下流プロセスをトリガーしたり、管理者への通知を遅延なく行ったりできます。たとえば、ユーザーのID検証と受動的・能動的生体認証チェックが承認されると、すぐにサービスへのアクセスを許可できます。

Go Webhookサーバーのセットアップ

GoでWebhookハンドラーを構築するには、受信するPOSTリクエストをリッスンするシンプルなHTTPサーバーをセットアップします。これにはGoの標準net/httpパッケージを使用します。まず、基本的なサーバー構造を作成しましょう。

package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

// WebhookPayload represents the structure of an incoming webhook from an identity verification service.
// This is a simplified example; actual payloads will vary.
type WebhookPayload struct {
	Event   string `json:"event"`
	SessionID string `json:"session_id"`
	Status  string `json:"status"`
	Data    json.RawMessage `json:"data"` // Use RawMessage to defer unmarshaling of nested data
}

func webhookHandler(w http.ResponseWriter, r *http.Request) {
	if r.Method != http.MethodPost {
		http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
		return
	}

	body, err := ioutil.ReadAll(r.Body)
	if err != nil {
		http.Error(w, "Error reading request body", http.StatusInternalServerError)
		return
	}

	var payload WebhookPayload
	err = json.Unmarshal(body, &payload)
	if err != nil {
		http.Error(w, "Error unmarshaling JSON payload", http.StatusBadRequest)
		log.Printf("Failed to unmarshal webhook: %v, Body: %s", err, body)
		return
	}

	// Log the received event for now. In a real application, you'd process this.
	log.Printf("Received webhook event: %s for session %s with status %s", payload.Event, payload.SessionID, payload.Status)

	// Respond with a 200 OK to acknowledge receipt. Most webhook senders expect this.
	w.WriteHeader(http.StatusOK)
	fmt.Fprint(w, "Webhook received successfully")
}

func main() {
	http.HandleFunc("/webhook", webhookHandler)

	port := ":8080"
	log.Printf("Webhook server starting on port %s\n", port)
	log.Fatal(http.ListenAndServe(port, nil))
}

この基本的な例では、ポート8080でリッスンし、/webhookエンドポイントへのPOSTリクエストを処理するHTTPサーバーをセットアップします。受信したJSONペイロードを読み取り、WebhookPayload構造体にアンマーシャルし、イベントをログに記録します。重要なのは、Webhookの受信が成功したことを確認するために200 OKステータスコードで応答することです。200 OKで応答しないと、送信側が配信を再試行し、重複処理が発生する可能性があります。

セキュリティの確保:署名検証とHTTPS

機密性の高い本人確認データを扱う場合、セキュリティは最重要事項です。受信するWebhookが正当であり、改ざんされていないことを確認する必要があります。これには主に2つのメカニズムがあります。

  1. HTTPS: データ転送中の暗号化を行い、盗聴を防ぐために、常にHTTPS経由でWebhookエンドポイントを公開してください。
  2. 署名検証: Diditを含むほとんどの信頼できる本人確認プロバイダーは、リクエストヘッダー(例:X-Didit-Signature)に署名またはハッシュを送信します。共有シークレットキーを使用して、生の要求本文の独自のハッシュを計算し、受信した署名と比較する必要があります。一致しない場合、Webhookは不正または侵害されている可能性があります。

以下に、ハンドラーに署名検証を追加する方法の例を示します。

// ... (previous imports and WebhookPayload struct)

import (
	"crypto/hmac"
	"crypto/sha256"
	"encoding/hex"
	// ... other imports
)

const webhookSecret = "YOUR_DIDIT_WEBHOOK_SECRET" // Replace with your actual secret

func verifySignature(body []byte, signature string) bool {
	hmacHash := hmac.New(sha256.New, []byte(webhookSecret))
	hmacHash.Write(body)
	expectedMAC := hmacHash.Sum(nil)

	decodedSignature, err := hex.DecodeString(signature)
	if err != nil {
		return false
	}

	return hmac.Equal(decodedSignature, expectedMAC)
}

func webhookHandler(w http.ResponseWriter, r *http.Request) {
	// ... (method check and body reading)

	signature := r.Header.Get("X-Didit-Signature") // Or similar header name from your provider
	if signature == "" {
		http.Error(w, "Missing signature header", http.StatusUnauthorized)
		return
	}

	if !verifySignature(body, signature) {
		http.Error(w, "Invalid signature", http.StatusUnauthorized)
		return
	}

	// ... (payload unmarshaling and processing)
}

webhookSecretは、アプリケーションにハードコードするのではなく、環境変数やシークレット管理システムに安全に保存することを忘れないでください。

堅牢性:非同期処理とリトライ

Webhookは、送信者からのタイムアウトやリトライを避けるために、迅速に処理されるべきです。複雑なタスクや時間のかかるタスクの場合は、処理を別のゴルーチンまたはメッセージキューにオフロードするのが最善です。Webhookハンドラーは、主にイベントの受信、検証、確認に焦点を当てるべきです。

// ... (previous code)

func processWebhookAsync(payload WebhookPayload) {
	// In a real application, this might involve:
	// - Storing the event in a database
	// - Pushing to a message queue (e.g., Kafka, RabbitMQ)
	// - Calling other internal services
	log.Printf("Asynchronously processing event: %s for session %s", payload.Event, payload.SessionID)
	// Simulate work
	// time.Sleep(5 * time.Second)
	log.Printf("Finished async processing for session %s", payload.SessionID)
}

func webhookHandler(w http.ResponseWriter, r *http.Request) {
	// ... (signature verification and payload unmarshaling)

	// Acknowledge receipt immediately.
	w.WriteHeader(http.StatusOK)
	fmt.Fprint(w, "Webhook received successfully")

	// Process asynchronously to avoid blocking the HTTP response.
	go processWebhookAsync(payload)
}

さらに、外部サービスは時々失敗する可能性があります。非同期処理中に実行される下流の呼び出しには、リトライメカニズムを実装してください。繰り返し失敗するイベントについては、デッドレターキュー(DLQ)の使用を検討し、手動での検査と再処理を可能にしてください。

Diditの活用法

Diditは、AIネイティブで開発者ファーストの本人確認プラットフォームとして、リアルタイムの本人確認イベントの統合を簡単かつ安全にします。Diditのモジュール型アーキテクチャはオーケストレーションのために構築されており、ID検証(OCR、MRZ、バーコード)、受動的・能動的生体認証、1:1顔照合、AMLスクリーニング&モニタリング、住所証明、さらにはプライバシー保護のための年齢推定を組み合わせた複雑なワークフローを定義できます。これらのワークフローの各ステップと最終結果は、Webhookイベントを直接Goアプリケーションにトリガーできます。

Diditでは、ビジネスコンソールでWebhook URLを設定すると、ユーザーの進捗状況や最終的な検証結果が準備されたときに、Diditが設定されたエンドポイントに自動更新を送信します。Diditは、RobustなWebhookペイロードを提供し、多くの場合、信頼性を検証するための署名ヘッダーを含んでおり、統合のセキュリティを確保します。これにより、検証結果に対する洗練された自動応答を構築し、手動介入なしでユーザーオンボーディングを加速し、不正検出を強化し、コンプライアンスプロセスを効率化できます。

無料のコアKYCやセットアップ費用なしといったDiditの利点と、クリーンなAPIと包括的なドキュメントが相まって、強力なイベント駆動型本人確認ソリューションを最大限の効率で構築できます。ノーコード統合のための検証リンクを使用する場合でも、APIを直接活用する場合でも、DiditのWebhookシステムは、ユーザーの検証ジャーニーと常に同期していることを保証します。

始めますか?

Diditの動作をご覧になりたいですか?今すぐ無料デモを入手してください。

Diditの無料ティアで無料で本人確認を開始しましょう。

本人確認と不正対策のインフラ。

KYC、KYB、取引監視、ウォレットスクリーニングを一つのAPIで。5分で統合できます。

AIにこのページの要約を依頼する
Goで本人確認イベント用Webhookハンドラーを構築する方法.