> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# サインイン方法：パスキー、コード、ソーシャル、SSO

> Didit認証では、パスワード、メールコード、マジックリンク、電話コード、パスキー、ソーシャル、組織SSO、Didit ID Walletによるサインインに加え、MFAとパスワードリセットを設定できます。

> [!WARNING]
>
> 認証機能は新しい機能です。ホスト型サインインページは、このページで説明するすべての方式に対応しています。ここで紹介するJSONエンドポイントは、独自のサインイン画面を構築するチーム(`sign_in_ui: "own"`)向けです。

方式を有効にするには、アプリケーションのAuthentication管理APIで`PUT methods/{name}/`に`{"enabled": true}`を送信するか、コンソールから設定します。ホスト型サインインには、有効にした方式だけが表示されます。

| 方式 | 名前 | 設定 |
| - | - | - |
| パスワード | `password` | パスワードを使ったメールでのサインアップにも必要です。 |
| メールコード | `code` | 不要です。 |
| マジックリンク | `magic` | 不要です。ホスト型ページのみで利用できます。 |
| 電話番号コード | `phone` | 電話番号検証ワークフローの`workflow_id`を送信します。 |
| パスキー | `passkey` | 不要です。 |
| ソーシャルサインイン | `google`、`microsoft`、`apple`、`github` | 独自の`client_id`と`client_secret`が必要です。サンドボックスのアプリケーションでは、代わりにDiditのテスト用アプリ(`credential_source: "didit_test"`)を使用できます。 |
| 組織SSO | `sso` | 顧客の組織ごとにSAMLまたはOIDC接続が必要です。 |
| Didit ID Wallet | `wallet` | 常に有効です。無効にすることはできません。 |

以下の各JSON呼び出しは、`POST authorize/`から取得した`transaction`から始まります。このトランザクションの有効期間は10分です。サインインに成功すると`{code, redirect_uri, state}`が返されます。このコードは60秒以内に`POST token/`で交換してください([トークンとJWKS](https://docs.didit.me/ja/authentication/tokens-and-jwks.md)を参照)。

サインインの呼び出しでは、コードの代わりに次のいずれかのステップが返される場合があります。そのステップを完了すると、コードを受け取れます。

| レスポンス | 次のステップ |
| - | - |
| `challenge`と`factors`を含む`mfa_required` | TOTPコードまたはリカバリーコードを送信するか、パスキーを使用します([MFA](#mfa)を参照)。 |
| `challenge`と`uri`を含む`mfa_enrollment_required` | MFAポリシーにより認証アプリが必要です。`POST mfa/setup/`で登録します。 |
| `challenge`と`methods`を含む`protection_required` | [ボット対策](https://docs.didit.me/ja/authentication/bot-protection.md)ポリシーにより、追加の証明が求められています。 |
| `verification_url`を含む`verification_required` | 検証の設定により、サインアップ時またはサインイン時にライブネスチェックまたは本人確認チェックが必要です。対象者を`verification_url`(有効期間30分)に誘導してください。チェックが承認されると、コードが返されます。 |

## パスワード

`POST password/`は`transaction`、`email`、`password`を受け取ります。

* パスワードは`password_min_length`(8、10、12、14文字のいずれか。デフォルトは10文字)を満たす必要があります。よく使われるパスワードや数字のみのパスワードは`password_policy`で拒否されます。[漏洩パスワードチェック](https://docs.didit.me/ja/authentication/bot-protection.md#漏洩パスワード)が有効な場合、既知の漏洩パスワードは`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はアテステーションを要求しません。

| 呼び出し | ボディ | 結果 |
| - | - | - |
| `POST passkeys/begin/` | `{transaction}` | `navigator.credentials.get()`用の`{challenge, options}`。クレデンシャルの一覧は送信されないため、ブラウザはそのオリジンのすべてのパスキーを提示します。 |
| `POST passkeys/complete/` | `{challenge, credential}` | サインインコード、または次のステップ。 |
| `POST passkeys/register/` | 空。`Authorization: Bearer <access_token>`を付与 | `navigator.credentials.create()`用のオプション。 |
| `POST passkeys/confirm/` | `{challenge, credential}`。同じトークンを付与 | 新しいパスキーの`{id}`。 |

* パスキーのチャレンジの有効期間は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](https://docs.didit.me/ja/authentication/tokens-and-jwks.md)に進むか、ロックアウトとチャレンジについては[ボット対策](https://docs.didit.me/ja/authentication/bot-protection.md)をお読みください。


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.