PUT methods/{name}/に{"enabled": true}を送信するか、コンソールから設定します。ホスト型サインインには、有効にした方式だけが表示されます。
以下の各JSON呼び出しは、
POST authorize/から取得したtransactionから始まります。このトランザクションの有効期間は10分です。サインインに成功すると{code, redirect_uri, state}が返されます。このコードは60秒以内にPOST token/で交換してください(トークンとJWKSを参照)。
サインインの呼び出しでは、コードの代わりに次のいずれかのステップが返される場合があります。そのステップを完了すると、コードを受け取れます。
パスワード
POST password/はtransaction、email、passwordを受け取ります。
- パスワードは
password_min_length(8、10、12、14文字のいずれか。デフォルトは10文字)を満たす必要があります。よく使われるパスワードや数字のみのパスワードはpassword_policyで拒否されます。漏洩パスワードチェックが有効な場合、既知の漏洩パスワードはpassword_breachedで拒否されます。 - パスワードでサインインできるのは、メールアドレスが認証済みのユーザーのみです。
- パスワードの誤り、未登録のメールアドレス、未認証のメールアドレス、ロックされたアカウント、ブロックされたアカウントは、いずれも同じ
400 {"error": "invalid_credentials"}を返します。UI側ではどれに該当するかを判別できず、攻撃者も判別できません。
サインアップ
サインアップでは、最初にメールアドレスを認証します。purpose: "signup"、email、passwordを指定してPOST email/start/を呼び出し、続いてコードを指定してPOST email/complete/を呼び出します。アカウントは認証済みのメールアドレスで作成されます。
signup_policyは、サインアップできるユーザーを決定します。anyone、invited(招待リンクがある場合のみ)、allowed_domainsのいずれかです。allow_subaddresses: false(デフォルト)の場合、ローカル部に+を含むアドレスは拒否されます。- ブランディングで利用規約またはプライバシーポリシーのリンクを設定している場合、ホスト型のサインアップフォームでそれらへの同意が求められます。
メールコード
POST email/start/はtransaction、purpose(loginまたはsignup)、emailを受け取り、202 {challenge, expires_in: 600}を返します。ユーザーには有効期間10分の6桁のコードが届きます。
POST email/complete/はtransaction、purpose、challenge、codeを受け取ります。試行は5回までで、それを超えるとユーザーは新しいコードをリクエストする必要があります。ホスト型ページでは、30秒後に新しいコードをリクエストできるようになります。
アカウントが存在しないアドレスへのログインコードは、signup_policyが許可している場合、アカウントを作成します。これがパスワードレスのサインアップです。
マジックリンク
ホスト型ページは、有効期間15分のサインインリンクを送信します。このリンクは元のPKCEトランザクションに紐付いているため、そのリンクを開始したフロー内でのみ機能します。ユーザーは、リンクで開いたページでサインインを確認します。マジックリンク用のJSONエンドポイントはありません。電話認証コード
POST phone/start/はtransaction、phone、および任意のchannel(デフォルトのsms、またはwhatsapp)を受け取ります。電話番号はE.164形式に正規化されます。202 {challenge, expires_in: 600}を返します。
POST phone/complete/はtransaction、challenge、6桁のcodeを受け取ります。試行は5回までです。
- 電話認証コードは、Diditの電話番号検証を通じて配信されます。電話番号検証を含むワークフローの
workflow_idを指定して、この方式を有効にしてください。 - 初回の電話番号サインインでアカウントが作成されるのは、
signup_policyがanyoneの場合のみです。 - 配信に失敗した場合、呼び出しは
503 {"error": "delivery_unavailable"}を返します。
パスキー
パスキーはWebAuthnを使用します。リライングパーティは、アプリケーションのサインインオリジンです。Diditはディスカバラブルクレデンシャル(レジデントキー)を要求し、指紋、顔、デバイスのPINなどによるユーザー検証を常に必須とします。Diditはアテステーションを要求しません。- パスキーのチャレンジの有効期間は5分です。
- パスキーを追加するには、直近5分以内に作成されたセッションが必要です。それ以外の場合、呼び出しは
403 {"error": "reauthentication_required"}を返します。先にユーザーを再度サインインさせてください。 - パスキーによるサインインは多要素認証として扱われます。
- サインアップ後、ホスト型ページはパスキーを追加するオプションを表示します(
passkeys/setup/begin/とpasskeys/setup/complete/)。 - アプリケーションに登録されたAndroidアプリでも、同じパスキーを使用できます。
ソーシャルサインイン
Google、Microsoft、Apple、GitHubでのサインインには、自社のOAuthアプリの認証情報を使用します。認証情報はPUT methods/{provider}/でcredentials: {client_id, client_secret}を指定して設定します。プロバイダーのコールバックは、サインインオリジンにあります。
あるプロバイダーで初めてサインインするときは、コード(POST social/email/start/とPOST social/email/verify/)を使ってメールアドレスの所有も証明します。以降、そのプロバイダーでのサインインではこのステップは省略されます。
GitHubは直近のサインインを証明できないため、prompt=loginまたはmax_ageを送信した場合は選択肢に表示されません。
組織SSO
組織SSOを使うと、顧客の企業が自社のSAMLまたはOIDCのIDプロバイダーを通じてサインインできます。顧客の組織ごとに、organizations/{id}/sso/でprotocol(samlまたはoidc)、enabled、configを指定して設定します。
- 顧客のIT部門に、7日間有効なセットアップリンクを送信できます。
- SAMLサービスプロバイダーのメタデータは
{origin}/sso/saml/metadata/で公開されます。 - ホスト型サインインは、本人の検証済みメールドメイン、またはサインインURLの
organization=<slug>から接続を特定します。
Didit ID Wallet
すでにDiditで認証を済ませた人は、Didit ID Walletでサインインできます。この方法は常に有効です。その後、セッションのverified_identityには、本人が共有を選択した情報が含まれます。
MFA
2要素目には、リカバリーコード付きの認証アプリ(TOTP)またはパスキーを使用します。mfa_policyで、MFAの必須対象を指定します。指定できる値はoptional、everyone、organization_admins(デフォルト)です。認証アプリを登録した人は、常にそれを使用する必要があります。- 認証アプリを登録するには、新しいセッション(5分以内に作成されたもの)で
POST mfa/enroll/を呼び出します。{challenge, uri}が返されるので、uriをQRコードとして表示します。次に、最初のコードをPOST mfa/confirm/に送信します。レスポンスには使い捨てのリカバリーコードが10個含まれます。これらは一度だけ表示してください。 - サインイン時は、TOTPコードまたはリカバリーコードを
challengeとともにPOST mfa/complete/に送信します。試行回数は5回までです。代わりにパスキーを使う場合は、POST mfa/passkey/begin/とPOST mfa/passkey/complete/を呼び出します。 - コードは30秒のタイムステップを使用します。一度受理されたコードは再使用できません。
- SMSおよびメールのコードは2要素目として使用できません。
パスワードの再設定
POST password-reset/start/はemailを受け取り、202 {"status": "sent", "expires_in": 1800}を返します。そのアドレスにアカウントがあるかどうかにかかわらず、レスポンスは同じです。リセットリンクの有効期間は30分です。
POST password-reset/complete/はtokenとpasswordを受け取り、{"status": "password_changed"}を返します。また、次の処理も行います。
- ロックアウトを解除します。
revoke_on_password_changeが有効な場合(デフォルト)、すべてのセッションを終了します。- その人に対する保留中の他のコードとリンクを無効にします。
招待
signup_policy: "invited"の場合、招待された人のみがサインアップできます。招待リンクの有効期間は7日間で、ホスト型の/inviteページが開きます。
続いてトークンとJWKSに進むか、ロックアウトとチャレンジについてはボット対策をお読みください。