メインコンテンツまでスキップ

MFA(多要素認証)

← 導入ガイドに戻る


できること

セキュリティ強化

2つ以上の認証要素を組み合わせて、不正アクセスを防ぎます。

パスワード漏洩だけでは突破できないセキュリティを実現します。

  • SMS認証: 電話番号に送られたワンタイムコードを入力
  • メール認証: メールアドレスに送られたワンタイムコードを入力

柔軟な認証ポリシー

アプリや操作(スコープ)ごとにMFAの要求を変えられます。

  • 全アプリで必須: 全てのアプリで2要素認証を使う
  • 特定アプリのみ必須: 運営管理画面、社員用アプリ等でのみMFA
  • 特定操作のみ必須: 送金(transfersスコープ)、設定変更等の重要操作時のみMFA
  • 選択式MFA: ユーザーがSMS/メールから選べる

OTP送信方式

メール認証とSMS認証では、選択できる送信方式が異なります。

送信方式メール認証SMS認証説明
SMTP(内蔵)-idp-server内蔵のSMTP送信。外部サービス不要
外部API委譲送信を外部サービス(SendGrid、Twilio等)に委譲
no_action(開発用)送信せずOTPを内部生成。Management APIでコード取得
  • メール認証: SMTP設定を行えばidp-server単体で完結。外部API委譲も可能
  • SMS認証: SMS送信機能を内蔵していないため、本番では外部サービスへの委譲が必須

ワンタイムコード管理

セキュアなコード生成と検証を自動で行います。

  • コードの自動生成
  • 有効期限管理(3分、5分、10分等)
  • 試行回数制限(3回、5回等)
  • コード再送信の制御

導入時に決めること

1. どの認証要素を組み合わせるか

選択肢説明向いているケース
パスワード + SMS最も一般的、ユーザーが慣れている金融サービス、決済アプリ
パスワード + メール追加コストなし業務システム、SaaS
選択式ユーザーがSMS/メールから選ぶ幅広いユーザー層

idp-serverでの設定:

  • 認証ポリシーで必要な認証要素の組み合わせを定義
  • SMS/メール送信サービスとの連携設定

2. MFAをどこに適用するか

選択肢説明制御方法
全アプリ必須全てのアプリでMFAを使うデフォルトポリシー
特定アプリのみ必須運営管理画面、社員用アプリ等の特定アプリのみMFAクライアントIDで制御
特定操作のみ必須送金、設定変更等の重要操作時のみMFAスコープで制御
ユーザーが選択MFAを使うかどうかユーザーが決めるOR条件ポリシー

idp-serverでの設定:

  • 認証ポリシーの適用条件(クライアントID、スコープ等)を設定
  • アプリ別・スコープ別の認証要件を定義

3. 第2要素の登録をいつさせるか

選択肢説明
初回ログイン時アカウント作成直後に登録
任意のタイミングユーザーが好きな時に登録
必要になった時MFA必要な操作時に促す

idp-serverでの設定:

  • 登録フローのタイミングを設定
  • 未登録時の挙動を定義

4. 認証コードの有効期限

決めること選択肢の例
コード有効期限3分、5分、10分
認証試行回数3回まで、5回まで

idp-serverでの設定:

  • SMS/メール認証設定で有効期限、リトライ回数を設定

まとめ

MFA(多要素認証)を導入する際の重要なポイント:

必ず決めること

  1. 認証要素の組み合わせ: パスワード + SMS、パスワード + メール、選択式
  2. 適用対象: 全アプリ必須、特定アプリのみ、特定操作のみ
  3. 登録タイミング: 初回ログイン時、任意、必要になった時
  4. コード有効期限: 3分、5分、10分

idp-serverが提供すること

  • SMS/メール認証の実装
  • 柔軟な認証ポリシー(AND/OR条件、アプリ別・スコープ別)
  • ワンタイムコードの生成・検証
  • 有効期限管理、試行回数制限
  • 外部SMS/メール送信サービスとの連携

自分で実装すること

  • 第2要素登録画面(電話番号・メールアドレス入力)
  • ワンタイムコード入力画面
  • 外部SMS/メール送信サービスの契約・設定

セキュリティの注意点

  • 第2要素の登録を強制しすぎると、ユーザー体験が低下
  • SMS/メールは通信事業者・メールサーバーに依存するリスクあり
  • コード有効期限は短すぎると入力が間に合わない(5分程度推奨)
  • アプリ単位でMFA制御するため、重要操作は専用アプリ・クライアントIDで分離推奨

パスワードリセット(メール認証による)

MFA設定があるテナントでは、メール認証を使ったセルフサービスのパスワードリセットが可能です。

仕組み

password:reset スコープ専用の認証ポリシーを設定することで、メール認証のみで password:reset スコープ付きトークンを取得できます。このトークンを使ってパスワードリセットAPIを呼び出します。

フロー

1. ユーザー: 「パスワードを忘れた」をクリック
2. アプリ: scope=openid password:reset で認可リクエスト
3. ユーザー: メールアドレスを入力
4. idp-server: OTPコードをメール送信
5. ユーザー: OTPコードを入力
6. アプリ: 認可コード → トークン交換(password:reset スコープ付き)
7. アプリ: POST /v1/me/password/reset で新パスワードを設定

認証ポリシー設定

password:reset スコープ要求時にメール認証のみで成功とするポリシーを追加します。通常のMFAポリシー(priority: 1)より高い優先度で設定します。

{
"description": "password_reset_email_only",
"priority": 10,
"conditions": {
"scopes": ["password:reset"]
},
"available_methods": ["email"],
"step_definitions": [
{ "method": "email", "order": 1, "requires_user": false, "user_identity_source": "email" }
],
"success_conditions": {
"any_of": [
[{ "path": "$.email-authentication.success_count", "type": "integer", "operation": "gte", "value": 1 }]
]
}
}

必要な設定

設定箇所追加内容
テナント scopes_supportedpassword:reset を追加
クライアント scopepassword:reset を追加
認証ポリシーpassword_reset_email_only ポリシーを追加

リセットAPI

POST /{tenant-id}/v1/me/password/reset
Authorization: Bearer {password:reset スコープ付きトークン}

{
"new_password": "新しいパスワード"
}

MFA設定がないテナント: メール認証設定がない場合は、管理者がManagement APIでパスワードをリセットします。詳細はログインを参照してください。


テンプレートで試す

ローカル環境ですぐに試せるテンプレートが用意されています。

cd config/templates/use-cases/mfa-email
./setup.sh

セットアップ後の動作確認は VERIFY.md を参照してください。

詳細: config/templates/use-cases/mfa-email/

関連ドキュメント


最終更新: 2026-01-27