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

> Auth0 で単一のカスタムドメインから複数のカスタムドメインに移行する方法を説明します。

# 複数のカスタムドメインへの移行

export const AuthCodeGroup = ({children, dropdown}) => {
  const [processedChildren, setProcessedChildren] = useState(children);
  useEffect(() => {
    let unsubscribe = null;
    function init() {
      unsubscribe = window.autorun(() => {
        const processChildren = node => {
          if (typeof node === "string") {
            let processedNode = node;
            for (const [key, value] of window.rootStore.variableStore.values.entries()) {
              const escapedKey = key.replaceAll(/[.*+?^${}()|[\]\\]/g, (String.raw)`\$&`);
              processedNode = processedNode.replaceAll(new RegExp(escapedKey, "g"), value);
            }
            return processedNode;
          } else if (Array.isArray(node)) {
            return node.map(processChildren);
          } else if (node && node.props && node.props.children) {
            return {
              ...node,
              props: {
                ...node.props,
                children: processChildren(node.props.children)
              }
            };
          }
          return node;
        };
        setProcessedChildren(processChildren(children));
      });
    }
    if (window.rootStore) {
      init();
    } else {
      window.addEventListener("adu:storeReady", init);
    }
    return () => {
      window.removeEventListener("adu:storeReady", init);
      unsubscribe?.();
    };
  }, [children]);
  return <CodeGroup dropdown={dropdown}>{processedChildren}</CodeGroup>;
};

export const AuthCodeBlock = ({filename, icon, language, highlight, children}) => {
  const [displayText, setDisplayText] = useState(children);
  const [copyText, setCopyText] = useState(children);
  const wrapperRef = React.useRef(null);
  useEffect(() => {
    let unsubscribe = null;
    function init() {
      if (!window.autorun || !window.rootStore) {
        return;
      }
      unsubscribe = window.autorun(() => {
        let processedChildrenForDisplay = children;
        let processedChildrenForCopy = children;
        for (const [key, value] of window.rootStore.variableStore.values.entries()) {
          const escapedKey = key.replaceAll(/[.*+?^${}()|[\]\\]/g, (String.raw)`\$&`);
          let displayValue = value;
          if (key === "{yourClientSecret}" && value !== "{yourClientSecret}") {
            displayValue = value.substring(0, 3) + "*****MASKED*****";
          }
          processedChildrenForDisplay = processedChildrenForDisplay.replaceAll(new RegExp(escapedKey, "g"), displayValue);
          processedChildrenForCopy = processedChildrenForCopy.replaceAll(new RegExp(escapedKey, "g"), value);
        }
        setDisplayText(processedChildrenForDisplay);
        setCopyText(processedChildrenForCopy);
      });
    }
    if (window.rootStore) {
      init();
    } else {
      window.addEventListener("adu:storeReady", init);
    }
    return () => {
      window.removeEventListener("adu:storeReady", init);
      unsubscribe?.();
    };
  }, [children]);
  useEffect(() => {
    if (!wrapperRef.current) return;
    const originalWriteText = navigator.clipboard.writeText.bind(navigator.clipboard);
    let isOverriding = false;
    const handleClick = e => {
      const button = e.target.closest('[data-testid="copy-code-button"]');
      if (!button || !wrapperRef.current.contains(button)) return;
      isOverriding = true;
      navigator.clipboard.writeText = text => {
        if (isOverriding) {
          isOverriding = false;
          navigator.clipboard.writeText = originalWriteText;
          return originalWriteText(copyText);
        }
        return originalWriteText(text);
      };
      setTimeout(() => {
        if (isOverriding) {
          isOverriding = false;
          navigator.clipboard.writeText = originalWriteText;
        }
      }, 100);
    };
    const wrapper = wrapperRef.current;
    wrapper.addEventListener('click', handleClick, true);
    return () => {
      wrapper.removeEventListener('click', handleClick, true);
      if (navigator.clipboard.writeText !== originalWriteText) {
        navigator.clipboard.writeText = originalWriteText;
      }
    };
  }, [copyText]);
  return <div ref={wrapperRef}>
      <CodeBlock filename={filename} icon={icon} language={language} lines highlight={highlight}>
        {displayText}
      </CodeBlock>
    </div>;
};

このガイドでは、単一のカスタムドメイン設定から[複数のカスタムドメイン](/docs/ja-jp/customize/custom-domains/multiple-custom-domains)への移行方法を説明します。ブランドや地域、顧客セグメントごとにドメインを追加する場合でも、スムーズに移行できるよう、このガイドで手順を追って説明します。

<div id="migration-scenarios">
  ## 移行シナリオ
</div>

状況に最も合うシナリオを選択してください。

| シナリオ              | 説明                                                               | ユースケース                | 複雑さ | ダウンタイム          |
| ----------------- | ---------------------------------------------------------------- | --------------------- | --- | --------------- |
| **ドメインを追加する**     | 現在 1 つのカスタムドメインを使用しており、既存のドメインを運用したまま追加したい場合                     | 複数のブランドまたはリージョンへの対応拡大 | 低   | なし              |
| **既存のドメインを置き換える** | 現在のカスタムドメインを新しいドメインに置き換えたい場合                                     | リブランディングまたはドメイン所有権の変更 | 中   | 最小限 (DNS 切り替え時) |
| **正規ドメインから移行する**  | 現在 Auth0 の正規ドメイン (例：`tenant.auth0.com`) を使用しており、カスタムドメインに移行したい場合 | 複数ドメインでの初回カスタムドメイン導入  | 中～高 | なし (並行運用)       |

<div id="pre-migration-checklist">
  ## 移行前チェックリスト
</div>

移行を開始する前に、以下の項目が完了していることを確認してください。

* すべての新しいカスタムドメインのドメイン所有権を確認している
* 現在の認証プロセスと API 連携を確認している
* 現在のドメインを使用しているすべてのアプリケーションを特定している
* 現在のメールテンプレートとリンクを文書化している
* SSL/TLS 証明書を取得している (自己管理証明書を使用している場合)
* 開発環境またはステージング環境で、新しいカスタムドメインの設定をテストしている
* ロールバック計画を準備している
* トラフィックの少ない時間帯に移行を予定している (該当する場合)
* 関係者とユーザーに通知している (必要な場合)

<div id="migration-steps">
  ## 移行手順
</div>

<div id="add-your-new-custom-domains">
  ### 新しいカスタムドメインを追加する
</div>

[Auth0 Dashboard](/docs/ja-jp/customize/custom-domains/multiple-custom-domains#configure-multiple-custom-domains) または [Management API](https://auth0.com/docs/api/management/v2) を使用して、新しいカスタムドメインを追加します。

<AuthCodeGroup>
  ```bash cURL theme={null}
  curl --request POST \
    --url 'https://{yourDomain}/api/v2/custom-domains' \
    --header 'authorization: Bearer {yourMgmtApiAccessToken}' \
    --header 'content-type: application/json' \
    --data '{
      "domain": "new-domain.example.com",
      "type": "auth0_managed_certs",
      "domain_metadata": {
        "purpose": "new-brand"
      }
    }'
  ```

  ```javascript Node.js theme={null}
  const newDomain = await management.customDomains.create({
    domain: 'new-domain.example.com',
    type: 'auth0_managed_certs',
    domain_metadata: {
      purpose: 'new-brand'
    }
  });

  console.log('Domain added:', newDomain.custom_domain_id);
  ```
</AuthCodeGroup>

<div id="verify-domain-ownership">
  ### ドメインの所有権を確認する
</div>

新しいカスタムドメインごとに、ドメイン所有権の確認手続きを完了します。

<div id="for-auth0-managed-certificates">
  #### Auth0 管理の証明書を使用する場合
</div>

1. Auth0 から提供された CNAME レコードを控えておきます
2. DNS プロバイダーに CNAME レコードを追加します
3. Auth0 Dashboard または API でドメインを検証します

```bash theme={null}
# 確認の詳細を取得する
curl --request GET \
  --url 'https://{yourDomain}/api/v2/custom-domains/{customDomainId}' \
  --header 'authorization: Bearer {yourMgmtApiAccessToken}'

# DNSレコードを追加後に確認する
curl --request POST \
  --url 'https://{yourDomain}/api/v2/custom-domains/{customDomainId}/verify' \
  --header 'authorization: Bearer {yourMgmtApiAccessToken}'
```

<div id="for-self-managed-certificates">
  #### 自己管理の証明書を使用する場合
</div>

1. DNS に必要な TXT レコードを追加します
2. リバースプロキシまたは CDN を設定します
3. SSL 証明書をアップロードします
4. ドメインを検証します

<div id="configure-default-domain-optional">
  ### デフォルトのドメインを設定する (任意)
</div>

メールとAPI呼び出しで1つのドメインをデフォルトで使用する場合は、[そのドメインをデフォルトのドメインとして設定します](/docs/ja-jp/customize/custom-domains/multiple-custom-domains/default-domain):

```bash theme={null}
curl --request PATCH \
  --url 'https://{yourDomain}/api/v2/custom-domains/{customDomainId}' \
  --header 'authorization: Bearer {yourMgmtApiAccessToken}' \
  --header 'content-type: application/json' \
  --data '{
    "is_default": true
  }'
```

<div id="update-application-configurations">
  ### アプリケーション設定を更新する
</div>

適切なカスタムドメインを使用するよう、アプリケーションの設定を更新します。

<div id="sdk-configuration">
  #### SDK の設定
</div>

Auth0 SDK の初期化設定を更新します。

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  必要なのは、`domain` パラメーターを Auth0 の正規ドメインから新しいカスタムドメインに変更することだけです。
</Callout>

<AuthCodeGroup>
  ```javascript Auth0 SPA SDK theme={null}
  // 変更前
  const auth0 = await createAuth0Client({
    domain: 'tenant.auth0.com',
    client_id: '{yourClientId}'
  });

  // 変更後
  const auth0 = await createAuth0Client({
    domain: 'new-domain.example.com', // 新しいカスタムドメインを使用
    client_id: '{yourClientId}'
  });
  ```

  ```javascript Auth0.js theme={null}
  // 変更前
  const webAuth = new auth0.WebAuth({
    domain: 'tenant.auth0.com',
    clientID: '{yourClientId}'
  });

  // 変更後
  const webAuth = new auth0.WebAuth({
    domain: 'new-domain.example.com',
    clientID: '{yourClientId}'
  });
  ```

  ```javascript Node.js theme={null}
  import { ManagementClient } from "auth0";

  // 変更前
  const auth0 = new ManagementClient({
    domain: 'tenant.auth0.com',
    clientId: '{yourClientId}',
    clientSecret: '{yourClientSecret}',
  });

  // 変更後
  const auth0 = new ManagementClient({
    domain: 'new-domain.example.com',
    clientId: '{yourClientId}',
    clientSecret: '{yourClientSecret}',
  });
  ```
</AuthCodeGroup>

<div id="callback-urls">
  #### コールバック URL
</div>

Auth0 Dashboard でアプリケーションのコールバック URL を更新します。

1. [**Auth0 Dashboard** > **アプリケーション**](https://manage.auth0.com/#/applications) に移動し、設定するアプリケーションを選択して、**Settings** タブを開きます。
2. **Allowed Callback URLs** に新しいドメインを追加します:
   ```
   https://new-domain.example.com/callback
   ```
3. **Allowed Logout URLs** を更新します:
   ```
   https://new-domain.example.com/logout
   ```
4. **Allowed Web Origins** を更新します:
   ```
   https://new-domain.example.com
   ```

<div id="update-email-templates">
  ### メールテンプレートを更新する
</div>

メールテンプレートでカスタムドメインの情報を使えるようにするには、次の手順を行います。

1. **Branding** > **Custom Domains** に移動します
2. 使用するドメインをデフォルトに設定します
3. 必要に応じて、"From" アドレス、件名、本文でカスタムドメインの情報を使うようメールテンプレートをカスタマイズします

<Note>
  ドメインをデフォルトに設定しても、メールの内容が自動的に変更されるわけではありません。デフォルトドメインのコンテキストがメールテンプレートで利用できるようになるだけです。その情報を使うには、テンプレートをカスタマイズする必要があります。`auth0-custom-domain` ヘッダーで特定のドメインが指定されていない場合は、デフォルトドメインのコンテキストが利用可能になります。
</Note>

<div id="update-social-identity-providers-idp">
  ### ソーシャルIDプロバイダー (IdP) を更新する
</div>

ソーシャルIDプロバイダーのリダイレクトURIを更新します：

<div id="google">
  #### Google
</div>

1. [Google Cloud Console](https://console.cloud.google.com) を開きます
2. **APIs & Services** > **Credentials** に移動します
3. **Authorized redirect URIs** に `https://new-domain.example.com/login/callback` を追加します

<div id="facebook">
  #### Facebook
</div>

1. [Facebook Developers](https://developers.facebook.com) にアクセスします
2. アプリ > **Facebook Login** > **Settings** に移動します
3. **有効な OAuth リダイレクト URI** に `https://new-domain.example.com/login/callback` を追加します

<div id="other-providers">
  #### その他のプロバイダー
</div>

設定済みのすべてのソーシャルプロバイダーについて、各プロバイダーのドキュメントに従ってリダイレクトURIを更新します。

<div id="update-enterprise-connections-if-applicable">
  ### エンタープライズ接続を更新する (必要に応じて)
</div>

SAML、WS-Fed、Azure AD、またはその他のエンタープライズ接続を使用している場合は、各接続の設定を更新してください。

<div id="saml-connections">
  #### SAML 接続
</div>

Assertion Consumer Service (ACS) URL を更新します。

```
https://new-domain.example.com/login/callback?connection={connectionName}
```

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  SP 起点の SAML リクエストを使用し、IdP が動的 ACS を受け入れる場合、IdP 側で ACS URL を手動で更新する必要はありません。
</Callout>

<div id="azure-ad-connections">
  #### Azure AD 接続
</div>

1. Azure Active Directory > **App registrations** に移動します
2. アプリ > **Authentication** を選択します
3. **リダイレクト URI** に `https://new-domain.example.com/login/callback` を追加します

<div id="adfs-connections">
  #### ADFS 接続
</div>

ADFS の設定でエンドポイントを更新し、新しいカスタムドメインを使用してください。

<div id="test-authentication">
  ### 認証をテストする
</div>

移行を完了する前に、次の項目を十分にテストしてください。

1. **ユーザーログイン**: ユーザーが新しいドメイン経由で認証できることを確認します
2. **パスワードリセット**: パスワードリセットメールで正しいドメインが使用されていることを確認します
3. **メールアドレスの確認**: メールアドレス確認用のリンクが正しく機能することを確認します
4. **ソーシャルログイン**: 設定されている各ソーシャルプロバイダーをテストします
5. **API 呼び出し**: API 呼び出しが新しいドメインで正しく動作することを確認します
6. **トークンの検証**: JWT に正しい `iss` クレームが含まれていることを確認します

<div id="monitor-and-verify">
  ### 監視と検証
</div>

移行後:

1. 認証ログを監視し、エラーがないか確認する
2. メールの配信状況とリンクの動作を確認する
3. SSL 証明書の有効性と有効期限を確認する
4. 異なる地域からテストする (該当する場合)
5. すべてのアプリケーションで、想定どおりのカスタムドメインが使用されていることを確認する

<div id="decommission-old-domain-if-applicable">
  ### 古いドメインの廃止 (該当する場合)
</div>

既存のカスタムドメインを置き換える場合:

1. すべてのアプリケーションが新しいドメインへ移行済みであることを確認します
2. 古いドメインへのトラフィックを監視し、すでに使用されていないことを確認します
3. 一定の猶予期間は、古いドメインを有効なまま維持することを検討します
4. 準備ができたら、古いカスタムドメインを削除します:

```bash theme={null}
curl --request DELETE \
  --url 'https://{yourDomain}/api/v2/custom-domains/{oldCustomDomainId}' \
  --header 'authorization: Bearer {yourMgmtApiAccessToken}'
```

<div id="migration-patterns">
  ## 移行パターン
</div>

<AccordionGroup>
  <Accordion title="並行運用（ダウンタイムなし）">
    古いカスタムドメインと新しいカスタムドメインを同時に運用します。

    1. 新しいカスタムドメインを追加する
    2. 新しいアプリケーションが新しいドメインを使うように更新する
    3. 既存のアプリケーションは古いドメインのまま維持する
    4. アプリケーションを段階的に移行する
    5. 移行完了後、古いドメインを廃止する

    **利点**: ダウンタイムなし、段階的な展開、容易なロールバック

    **欠点**: 一時的に管理負荷が増える
  </Accordion>

  <Accordion title="アプリケーションごとの段階的な移行">
    アプリケーションを1つずつ移行します。

    1. 優先度またはリスクに基づいてアプリケーションを特定する
    2. リスクの低いアプリケーションから先に移行する
    3. 問題がないか確認してから次に進む
    4. 残りのアプリケーションを移行する
    5. 古い設定を整理する

    **利点**: 制御しやすい展開、問題の早期発見

    **欠点**: 移行期間が長くなる
  </Accordion>

  <Accordion title="ブルーグリーンデプロイ">
    テストのために別々の環境を使用します。

    1. ステージング環境に新しいカスタムドメインを設定する
    2. すべての機能を十分にテストする
    3. 本番環境を1回の作業で切り替える
    4. 古いドメインをバックアップとして残す
    5. 検証期間の終了後に廃止する

    **利点**: 十分なテスト、迅速なロールバック

    **欠点**: 別の環境が必要
  </Accordion>
</AccordionGroup>

<div id="handling-existing-user-sessions">
  ## 既存のユーザーセッションへの対応
</div>

カスタムドメインの移行時には、既存のユーザーセッションに影響が生じる場合があります。

<div id="session-considerations">
  ### セッションに関する注意点
</div>

* 古いドメインで作成されたセッションは、有効期限が切れるまで引き続き有効です
* 今後のログインでは、新しいドメインでセッションが作成されます
* ドメインをまたぐセッションには、慎重な計画が必要です

<div id="recommended-approach">
  ### 推奨アプローチ
</div>

1. **ユーザーへの通知**: 再度ログインが必要になる可能性があることをユーザーに伝える
2. **猶予期間**: 移行期間中も古いドメインを引き続き有効にしておく
3. **セッション移行**: セッションの移行には Universal Login を使用する
4. **明確な案内**: ユーザーに問題が発生した場合に備え、わかりやすい案内を提供する

<div id="rollback-plan">
  ## ロールバック手順
</div>

移行中に問題が発生した場合:

<div id="immediate-rollback">
  ### 即時ロールバック
</div>

1. アプリケーションの設定を以前のドメインを使用する状態に戻す
2. 今後の再試行に備えて、新しいカスタムドメインの設定は維持する
3. 問題を記録し、トラブルシューティングに備える

<div id="partial-rollback">
  ### 部分的なロールバック
</div>

1. 影響を受けたアプリケーションを特定する
2. 該当するアプリケーションのみを以前のドメインに戻す
3. 問題を調査して修正する
4. 準備が整ったら再移行する

<div id="complete-rollback">
  ### 完全なロールバック
</div>

1. すべてのアプリケーション設定を更新し、古いドメインを使用する
2. デフォルトドメインを設定している場合は、古いドメインに戻す
3. 必要に応じて、ユーザーに必要な対応を通知する
4. あらためて移行を試みるための予定を立てる

<div id="troubleshooting">
  ## トラブルシューティング
</div>

<div id="common-issues-and-solutions">
  ### よくある問題と解決策
</div>

| 問題                     | 原因                             | 解決策                                                       |
| ---------------------- | ------------------------------ | --------------------------------------------------------- |
| ドメインの検証に失敗する           | DNS レコードが伝播していない               | DNS が伝播するまで待ち (最大 48 時間かかる場合があります) 、CNAME レコードが正しいことを確認する |
| ログイン時に古いドメインへリダイレクトされる | アプリケーションの設定が更新されていない           | SDK の初期化設定と callback URL を更新する                            |
| メール内のリンクで誤ったドメインが使われる  | デフォルトドメインが設定されていない             | デフォルトドメインを設定するか、メールルーティングを設定する                            |
| ソーシャルログインに失敗する         | Redirect URI が更新されていない         | ソーシャルプロバイダーの許可済み Redirect URI に新しいカスタムドメインを追加する           |
| トークン発行者が無効             | JWT の検証で古いドメインを想定している          | 新しいドメインを issuer として受け入れるようにトークンの検証を更新する                   |
| SAML アサーションエラー         | ACS URL が更新されていない              | 新しいカスタムドメイン URL で SAML の設定を更新する                           |
| 証明書エラー                 | 証明書がプロビジョニングされていないか、有効期限が切れている | ドメインを確認し、証明書のプロビジョニングが完了するまで待つか、証明書を更新する                  |

<div id="getting-help">
  ### サポートを受ける
</div>

移行中に問題が発生した場合は、以下をお試しください：

1. [Auth0 Community](https://community.auth0.com/) で同様の問題が報告されていないか確認します
2. [トラブルシューティングに関するドキュメント](https://support.auth0.com/center/s/knowledge?selectedTopics=Custom%20Domains\&isTopicFilter=true) を確認します
3. 次の情報を添えて [Auth0 Support](https://support.auth0.com/) にお問い合わせください：
   * テナント名
   * カスタムドメイン ID
   * 問題の詳細な説明
   * 再現手順
   * エラーメッセージまたはログ

<div id="post-migration-best-practices">
  ## 移行後のベストプラクティス
</div>

移行が完了したら:

1. **設定を文書化する**: どのアプリケーションがどのカスタムドメインを使用しているかを記録します
2. **証明書の有効期限を監視する**: 証明書の更新に備えてアラートを設定します
3. **定期的に見直す**: カスタムドメインの設定がビジネスニーズに合っていることを確認します
4. **ランブックを更新する**: 新しいカスタムドメイン情報を運用ドキュメントに反映します
5. **チームメンバーに周知する**: 新しいマルチドメイン構成をチームが理解していることを確認します
6. **拡張を見据えて計画する**: 将来的に追加のドメインをどのように管理するかを検討します

<div id="learn-more">
  ## 詳しくはこちら
</div>

* [複数のカスタムドメイン](/docs/ja-jp/customize/custom-domains/multiple-custom-domains)
* [デフォルトのカスタムドメイン](/docs/ja-jp/customize/custom-domains/multiple-custom-domains/default-domain)
* [複数のカスタムドメイン向け Management API](https://auth0.com/docs/api/management/v2)
* [カスタムドメインを使用する機能を設定する](/docs/ja-jp/customize/custom-domains/configure-features-to-use-custom-domains)
