> ## Documentation Index
> Fetch the complete documentation index at: https://docs-dev-fix-docs-5528-php-updates.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

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

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

Auth0は、様々なIDプロバイダーのユーザーアカウントのリンクをサポートします。これによりユーザーは、どのアカウントから認証してもアプリによって認識され、同じユーザープロファイルに関連付けられます。

<Card title="利用可能性はAuth0プランによって異なる">
  この機能が利用できるかどうかは、使用しているログイン実装とAuth0プラン（または契約）によります。詳細については、「[価格設定](https://auth0.com/pricing)」をお読みください。
</Card>

Auth0は、デフォルトではすべてのIDを個別のIDとして扱います。たとえば、あるユーザーが最初にAuth0データベースにログインし、次にGoogleまたはFacebook経由でログインした場合、これら2つの試行は、Auth0には2人の別々のユーザーとして表示されます。ユーザーがアカウントを明示的にリンクできるようにする機能を実装できます。このシナリオでは、ユーザーは、恐らくGoogleなどの初期プロバイダーを使用してログインします。貴社のアプリケーションには、別のアカウントを最初のアカウントにリンクできるようにするリンク、またはボタンが搭載されているでしょう。その場合、ユーザーが2番目のプロバイダーでログインしたときに2番目のアカウントが最初のアカウントにリンクされるよう、ユーザーがこのリンク/ボタンをクリックすると、アプリケーションが呼び出しを行います。

## アカウントをリンクする利点

* ユーザーが、IDプロバイダーごとに個別のプロファイルを作成せずに、任意のIDプロバイダーを使用してログインできること
* 登録ユーザーは、新しいソーシャルログインまたはパスワードレスログインを使用できるものの、既存のプロファイルは引き続き使用できること
* パスワードレスログインを使用して登録したユーザーが、より詳細なプロファイルを有するアカウントにリンクできるようになること
* アプリケーションが、様々な接続に保存されているユーザープロファイルデータを取得できるようになること

## 注意事項

アカウントリンクが安全でないと、悪意のあるアクターが正当なユーザーアカウントにアクセスできるようになってしまいます。以下の点を常に念頭に置いてください：

手動、自動アカウントリンクの両方について、テナントは、リンクが発生する前に**両方**のアカウントの認証を要求する必要があります。

また、**すべての**手動アカウントリンクで、ユーザーに資格情報の入力を求める必要があります。

## 仕組み

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

次の例では、サンプルのプライマリアカウントとセカンダリアカウントに対して、リンクされたプロファイルがどのようになるかを説明しています。

<AuthCodeGroup>
  ```json プライマリアカウントのプロファイル lines 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 セカンダリアカウントのプロファイル lines 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 関連付けられたプロファイル lines 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`およびその他のすべてのメインプロファイルのプロパティは、引き続きプライマリIDのプロパティであること
* `user.identities`配列の最初のIDが、プライマリIDであること
* これで、セカンダリアカウントがプライマリプロファイルの`user.identities`配列に埋め込まれること
* セカンダリアカウントの属性は、配列内の対応するIDの`profileData`フィールド内に配置されること
* プライマリアカウントの`user_metadata`と`app_metadata`は、変更されていないこと
* セカンダリアカウントの`user_metadata`と`app_metadata`は、破棄されること
* ユーザープロファイルと関連付けられたIDの自動マージは、行われないこと
* セカンダリアカウントは、ユーザーリストから削除されること
* プライマリアカウントを削除すると、セカンダリアカウントも削除されること

### メタデータのマージ

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

[Auth0 Node.js SDK for APIv2](https://github.com/auth0/node-auth0/)も、ご利用いただけます。

詳細については、「[Understand How Metadata Works in User Profiles（ユーザープロファイルでのメタデータの仕組みを理解する）](/docs/ja-jp/manage-users/user-accounts/metadata)」をお読みください。

## シナリオ

アカウントリンクを実装するには、次の2つの方法があります：

* ユーザー主導のアカウントリンク：ユーザーが、アプリの管理者画面を使用してアカウントをリンクできるようにします。
* 推奨されるアカウントリンク：同じメールアドレスを持つアカウントを特定し、アプリ内でユーザーにそれらをリンクするよう促します。

### ユーザー主導のアカウントリンク

通常、アカウントリンクは認証されたユーザーが主導します。貴社のアプリは、ユーザーのプロフィールページにある、\*\*［Link accounts（アカウントのリンク）］\*\*ボタンのようなUIを有していなければなりません。

シングルページアプリケーションでユーザー主導のアカウントリンクを実装する方法について詳しくは、[「Client-Side Account Linking（クライアント側のアカウントリンク）」](/docs/ja-jp/users/references/link-accounts-client-side-scenario)をご一読ください。通常のウェブアプリケーションでユーザー主導のアカウントリンクを実装する方法について詳しくは、[「Server-Side Account Linking（サーバー側のアカウントリンク）」](/docs/ja-jp/users/references/link-accounts-server-side-scenario)をご一読ください。

### 推奨されるアカウントリンク

同じメールアドレスを持つアカウントを特定し、ユーザーにリンクするよう促すことができます。たとえば、ユーザーは[user@gmail.com](mailto:user@gmail.com)でGoogleのアカウントを作成し、同じメールアドレスにリンクされたアカウントでFacebookにログインできます。

その場合は、リンク先のアカウントで最初に認証を行うことで、使用可能なアカウントの一覧をユーザーに表示して、リンクできるようにすることが可能です。

また、[Account Link拡張機能](/docs/ja-jp/customize/extensions/account-link)を使用しても、同じ結果を得ることができます。

以前は一部のケースで、IDトークンを使ってユーザーアカウントのリンクやリンク解除ができました。しかし、この機能は廃止されます。今後はすべてのケースでアクセストークンを使用する必要があります。

## もっと詳しく

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