> ## 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 で、さまざまなIDプロバイダーのユーザーアカウントをリンクする方法について説明します。

# ユーザーアカウントリンク

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>;
};

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  Connected Accounts を使用すると、1 つの Auth0 ユーザープロファイルに複数の外部アカウントをリンクできます。サポートされている外部プロバイダーで Connected Accounts を有効にすると、ユーザーが正常にログインした後、Auth0 はそのプロバイダーのアカウントを自動的にユーザープロファイルに追加します。詳しくは、[Token Vault の Connected Accounts](/ja/docs/secure/tokens/token-vault/connected-accounts-for-token-vault) を参照してください。
</Callout>

Auth0 は、さまざまな <Tooltip tip="IDプロバイダー（IdP）: デジタルIDを保存および管理するサービス。" cta="用語集を表示" href="/ja/docs/glossary?term=identity+providers">IDプロバイダー</Tooltip> のユーザーアカウントのアカウントリンクをサポートしています。これにより、ユーザーはどのアカウントで認証しても、アプリでは同一ユーザーとして認識され、同じユーザープロファイルに関連付けられます。

<Card title="利用可否は Auth0 プランによって異なります">
  この機能が利用可能かどうかは、ログイン実装の構成と Auth0 プランまたはカスタム契約の両方によって決まります。詳しくは、[Pricing](https://auth0.com/pricing) を参照してください。
</Card>

Auth0 はデフォルトで、すべての ID を別個のものとして扱います。たとえば、ユーザーが сначала Auth0 データベースでログインし、その後 Google または Facebook 経由でログインした場合、Auth0 ではこれら 2 回のログインは別々の 2 人のユーザーとして認識されます。ユーザーが明示的にアカウントをリンクできるようにする機能を実装することは可能です。このシナリオでは、ユーザーは最初のプロバイダー (たとえば Google) でログインします。次に、アプリケーションは、別のアカウントを最初のアカウントにリンクするためのリンクまたはボタンを提供します。ユーザーがそのリンクまたはボタンをクリックすると、アプリケーションが呼び出しを行い、ユーザーが 2 つ目のプロバイダーでログインした際に、2 つ目のアカウントが 1 つ目のアカウントにリンクされるようにします。

<div id="advantages-of-linking-accounts">
  ## アカウントリンクの利点
</div>

* ユーザーは、IDプロバイダーごとに別々のプロファイルを作成しなくても、どのIDプロバイダーでもログインできます
* 登録済みのユーザーは、新しいソーシャルログインまたは<Tooltip tip="パスワードレス: 第1要素としてパスワードに依存しない認証形式。" cta="用語集を表示" href="/ja/docs/glossary?term=passwordless">パスワードレス</Tooltip>ログインを使いながら、既存のプロファイルをそのまま利用できます
* パスワードレスログインで登録したユーザーは、より充実したプロファイルを持つアカウントにリンクできます
* アプリケーションで、さまざまな接続に保存されているユーザープロファイルデータを取得できます

<div id="precautions">
  ## 注意事項
</div>

安全でない方法でアカウントをリンクすると、悪意のある第三者が正規のユーザーアカウントにアクセスできる可能性があります。次の点に注意してください。

手動リンクでも自動リンクでも、リンクを行う前に、テナントで**両方**のアカウントに対する認証を要求する必要があります。

さらに、手動でアカウントをリンクする場合は**毎回**、ユーザーに資格情報の入力を求める必要があります。

<div id="how-it-works">
  ## 仕組み
</div>

アカウントリンクでは、既存の 2 つのユーザープロファイルが 1 つに統合されます。アカウントをリンクするには、**プライマリアカウント** と **セカンダリアカウント** を指定する必要があります。

以下の例は、サンプルのプライマリアカウントとセカンダリアカウントをリンクした場合に、結果のリンク済みプロファイルがどのようになるかを示しています。

<AuthCodeGroup>
  ```json プライマリアカウントのプロファイル 行を展開可能 theme={null}
  {
    "email": "your0@email.com",
    "email_verified": true,
    "name": "John Doe",
    "given_name": "John",
    "family_name": "Doe",
    "picture": "https://lh3.googleusercontent..../photo.jpg",
    "gender": "male",
    "locale": "en",
    "user_id": "google-oauth2|115015401343387192604",
    "identities": [
      {
        "provider": "google-oauth2",
        "user_id": "115015401343387192604",
        "connection": "google-oauth2",
        "isSocial": true
      }
    ],
    "user_metadata": {
      "color": "red"
    },
    "app_metadata": {
      "roles": [
        "Admin"
      ]
    },
    ...
  }
  ```

  ```json セカンダリアカウントのプロファイル 行 theme={null}
  {
    "phone_number": "+14258831929",
    "phone_verified": true,
    "name": "+14258831929",
    "updated_at": "2015-10-08T18:35:18.102Z",
    "user_id": "sms|560ebaeef609ee1adaa7c551",
    "identities": [
      {
        "user_id": "560ebaeef609ee1adaa7c551",
        "provider": "sms",
        "connection": "sms",
        "isSocial": false
      }
    ],
    "user_metadata": {
      "color": "blue"
    },
    "app_metadata": {
      "roles": [
        "AppAdmin"
      ]
    },
    ...
  }
  ```

  ```json リンク後のプロファイル 行を展開可能 theme={null}
  {
    "email": "your0@email.com",
    "email_verified": true,
    "name": "John Doe",
    "given_name": "John",
    "family_name": "Doe",
    "picture": "https://lh3.googleusercontent..../photo.jpg",
    "gender": "male",
    "locale": "en",
    "user_id": "google-oauth2|115015401343387192604",
    "identities": [
      {
        "provider": "google-oauth2",
        "user_id": "115015401343387192604",
        "connection": "google-oauth2",
        "isSocial": true
      },
      {
        "profileData": {
          "phone_number": "+14258831929",
          "phone_verified": true,
          "name": "+14258831929"
        },
        "user_id": "560ebaeef609ee1adaa7c551",
        "provider": "sms",
        "connection": "sms",
        "isSocial": false
      }
    ],
    "user_metadata": {
      "color": "red"
    },
    "app_metadata": {
      "roles": [
        "Admin"
      ]
    },
    ...
  }
  ```
</AuthCodeGroup>

次の点に注意してください。

* `user_id` とその他すべてのメインプロファイル属性は、引き続きプライマリ identity のものです
* `user.identities` 配列の最初の identity はプライマリ identity です
* セカンダリアカウントは、プライマリプロファイルの `user.identities` 配列内に埋め込まれます
* セカンダリアカウントの属性は、配列内の対応する identity の `profileData` フィールドに格納されます
* プライマリアカウントの `user_metadata` と `app_metadata` は変更されません
* セカンダリアカウントの `user_metadata` と `app_metadata` は破棄されます
* 関連する identity を持つユーザープロファイルが自動的にマージされることはありません
* セカンダリアカウントはユーザー一覧から削除されます
* プライマリアカウントを削除すると、セカンダリアカウントも削除されます

<div id="metadata-merge">
  ### メタデータのマージ
</div>

アカウントのリンク時に、メタデータが自動的にマージされることはありません。マージする場合は、Manage API の [`/users/patch_users_by_id`](https://auth0.com/docs/api/v2#!/Users/patch_users_by_id) エンドポイントを使用して手動で行う必要があります。

[APIv2 向け Auth0 Node.js SDK](https://github.com/auth0/node-auth0/) も利用できます。

詳細については、[ユーザープロファイルにおけるメタデータの仕組み](/ja/docs/manage-users/user-accounts/metadata) を参照してください。

<div id="scenarios">
  ## シナリオ
</div>

アカウントリンクを実装する方法は 2 つあります。

* ユーザー主導のアカウントリンク: アプリ内の管理画面から、ユーザーが自分のアカウントをリンクできるようにします。
* 提案型のアカウントリンク: 同じメールアドレスを持つアカウントを特定し、アプリ内でユーザーにアカウントのリンクを促します。

<div id="user-initiated-account-linking">
  ### ユーザー主導のアカウントリンク
</div>

通常、アカウントリンクは認証済みのユーザーによって開始されます。アプリケーションでは、ユーザーのプロフィールページに **アカウントをリンク** ボタンなどの UI を用意する必要があります。

Single Page Application でユーザー主導のアカウントリンクを実装する方法について詳しくは、[Client-Side Account Linking](/ja/docs/manage-users/user-accounts/user-account-linking/user-initiated-account-linking-client-side-implementation) を参照してください。Regular Web Application でユーザー主導のアカウントリンクを実装する方法について詳しくは、[Server-Side Account Linking](/ja/docs/manage-users/user-accounts/user-account-linking/suggested-account-linking-server-side-implementation) を参照してください。

<div id="suggested-account-linking">
  ### 推奨されるアカウントリンク
</div>

同じメールアドレスを持つアカウントを見つけて、それらをリンクするようユーザーに促すことができます。たとえば、ユーザーが `user@gmail.com` で Google アカウントを作成したあと、同じメールアドレスに関連付けられた Facebook アカウントでログインする場合があります。

このような場合は、リンク先のアカウントでまず認証してもらったうえで、リンク可能なアカウントの一覧をユーザーに表示できます。

同じことを実現するには、[Account Link Extension](/ja/docs/customize/extensions/account-link-extension) を使用することもできます。

<Warning>
  これまでは、一部のケースで IDトークン を使用してユーザーアカウントのリンクおよびリンク解除を行うことができました。この機能は現在、非推奨です。今後は、すべてのケースで アクセストークン を使用する必要があります。
</Warning>

<div id="learn-more">
  ## 詳細情報
</div>

* [ユーザーアカウントをリンクする](/ja/docs/manage-users/user-accounts/user-account-linking/link-user-accounts)
* [ユーザーアカウントのリンクを解除する](/ja/docs/manage-users/user-accounts/user-account-linking/unlink-user-accounts)
* [ユーザー主導のアカウントリンク: クライアントサイド実装](/ja/docs/manage-users/user-accounts/user-account-linking/user-initiated-account-linking-client-side-implementation)
* [ユーザーアカウントリンク: サーバーサイド実装](/ja/docs/manage-users/user-accounts/user-account-linking/suggested-account-linking-server-side-implementation)
