> ## 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.

> Management API のユーザーアカウントのリンクを解除するエンドポイントを使用して、対象のユーザーアカウントから ID のリンクを解除し、再び個別のユーザーアカウントに戻す方法を学びます。

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

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

Auth0 <Tooltip tip="Management API: お客様が管理タスクを実行できるようにする製品。" cta="用語集を見る" href="/docs/ja-jp/glossary?term=Management+API">Management API</Tooltip> の [ユーザーアカウントのリンクを解除する](https://auth0.com/docs/api/management/v2#!/Users/delete_user_identity_by_user_id) エンドポイント、または auth0.js ライブラリを使用すると、対象のユーザーアカウントからアイデンティティをリンク解除し、再び別個のユーザーアカウントとして扱えるようにできます。

リンク解除の結果は次のとおりです。

* セカンダリアカウントは、プライマリアカウントの identities 配列から削除されます。
* 新しいセカンダリユーザーアカウントが作成されます。
* セカンダリアカウントにはメタデータが設定されません。

セカンダリアイデンティティを完全に削除することが目的であれば、まずアカウントのリンクを解除してから、[新しく作成されたセカンダリアカウントを削除する](/docs/ja-jp/manage-users/user-accounts/delete-users)必要があります。

エンドポイントを呼び出す場所に応じて、次の 2 つの scope のいずれかを使用します。

* [クライアント側コード](/docs/ja-jp/manage-users/user-accounts/user-account-linking/user-initiated-account-linking-client-side-implementation) では `update:current_user_identities`
* [サーバーサイドコード](/docs/ja-jp/manage-users/user-accounts/user-account-linking/suggested-account-linking-server-side-implementation) では `update:users`

このエンドポイントでは、次のパラメーターを使用します。

| Parameter  | Type     | Description                                                   |
| ---------- | -------- | ------------------------------------------------------------- |
| `id`       | `string` | プライマリユーザーアカウントの ID (必須)                                       |
| `provider` | `string` | リンクされたセカンダリアカウントのアイデンティティプロバイダー名 (例: `google-oauth2`)         |
| `user_id`  | `string` | リンクされたセカンダリアカウントの ID (例: \` の後ろの `123456789081523216417` の部分) |

インスタンスに複数のプロバイダーのユーザーがいる場合は、プロバイダー名を指定するため、`user_id` string の前に `[connection_name]|` を含めることもできます (例: `"user-id": "google-oauth2|123456789081523216417"`) 。

<div id="response-example">
  ## レスポンス例
</div>

```json lines theme={null}
[
  {
    "connection": "Initial-Connection",
    "user_id": "5457edea1b8f22891a000004",
    "provider": "auth0",
    "isSocial": false,
    "access_token": "",
    "profileData": {
      "email": "",
      "email_verified": false,
      "name": "",
      "username": "johndoe",
      "given_name": "",
      "phone_number": "",
      "phone_verified": false,
      "family_name": ""
    }
  }
]
```

<div id="use-jwt-from-the-primary-account">
  ## プライマリアカウントの JWT を使用する
</div>

アカウントのリンクを解除するには、認可にプライマリアカウントの <Tooltip tip="JSON Web トークン（JWT）: 2者間でクレームを安全に表現するために使用される標準的な ID トークン形式（多くの場合、アクセストークン形式でもあります）。" cta="用語集を見る" href="/docs/ja-jp/glossary?term=JWT">JWT</Tooltip> を使用して、Management API の [ユーザーアカウントのリンクを解除するエンドポイント](https://auth0.com/docs/api/v2#!/Users/delete_user_identity_by_user_id) を呼び出します:

export const codeExample1 = `function unlinkAccount(secondaryProvider, secondaryUserId){
  var primaryUserId = localStorage.getItem('user_id');
  var primaryJWT = localStorage.getItem('id_token');
  $.ajax({
    type: 'DELETE',
    url: 'https://' + '{yourDomain}' + '/api/v2/users/' + primaryUserId +
         '/identities/' + secondaryProvider + '/' + secondaryUserId,
    headers: {
      'Authorization': 'Bearer ' + primaryJWT
    }
  }).then(function(identities){
    alert('リンク解除しました');
    showLinkedAccounts(identities);
  }).fail(function(jqXHR){
    alert('アカウントのリンク解除中にエラーが発生しました: ' + jqXHR.status + ' ' + jqXHR.responseText);
  });
}`;

<AuthCodeBlock children={codeExample1} language="javascript" />

<div id="use-access-token-with-the-updateusers-scope">
  ## `update:users` スコープを持つアクセストークンを使用する
</div>

2つ以上のユーザーアカウントのリンクを解除する必要がある場合は、`update:users` スコープを持つ[Management API のアクセストークン](https://auth0.com/docs/api/v2/tokens)を使用して、Management APIの[ユーザーアカウントのリンクを解除するエンドポイント](https://auth0.com/docs/api/v2#!/Users/delete_user_identity_by_user_id)を呼び出してください。

```javascript lines theme={null}
function unlinkAccount(secondaryProvider, secondaryUserId) {
  var primaryUserId = localStorage.getItem('user_id');
  var primaryAccessToken = localStorage.getItem('access_token');

  // プライマリユーザーのアクセストークンをベアラートークンとして使用して、リンク解除対象のアカウントを特定します。
  // セカンダリユーザーのユーザーIDを使用して、プライマリアカウントからリンク解除するユーザーを特定します。

  $.ajax({
    type: 'DELETE',
    url: 'https://' + AUTH0_DOMAIN +'/api/v2/users/' + primaryUserId +
         '/identities/' + secondaryProvider + '/' + secondaryUserId,
    headers: {
      'Authorization': 'Bearer ' + primaryAccessToken
    }
  }).then(function(identities){
    alert('unlinked!');
    showLinkedAccounts(identities);
  }).fail(function(jqXHR){
    alert('Error unlinking Accounts: ' + jqXHR.status + ' ' + jqXHR.responseText);
  });
}
```

<div id="unlink-accounts-from-server-side-code">
  ## サーバーサイドコードからアカウントのリンクを解除する
</div>

1. 各要素が個別のユーザーアカウントを表す、新しい ID の配列でセッション内のユーザーを更新します。

```javascript lines theme={null}
const ensureLoggedIn = require('connect-ensure-login').ensureLoggedIn();
const Auth0Client = require('../Auth0Client');
const express = require('express');
const router = express.Router();
...
router.post('/unlink-accounts/:targetUserProvider/:targetUserId',ensureLoggedIn, (req,res,next) => {
  Auth0Client.unlinkAccounts(req.user.id, req.params.targetUserProvider, req.params.targetUserId)
  .then( identities => {
    req.user.identities = req.user._json.identities = identities;
    res.send(identities);
  })
  .catch( err => {
    console.log('Error unlinking accounts!',err);
    next(err);
  });
});
```

1. `update:users` スコープを持つ [Management API のアクセストークン](https://auth0.com/docs/api/v2/tokens) を使用して、Management API v2 の [ユーザーアカウントのリンクを解除するエンドポイント](https://auth0.com/docs/api/v2#!/Users/delete_user_identity_by_user_id) を呼び出します。

export const codeExample2 = `const request = require('request');

class Auth0Client {
  ...
  unlinkAccounts(rootUserId, targetUserProvider, targetUserId){
    return new Promise((resolve,reject) => {
      var reqOpts = {
        method: 'DELETE',
        url: 'https://{yourDomain}/api/v2/users/' + rootUserId +
            '/identities/' + targetUserProvider + '/' + targetUserId,
        headers: {
          'Authorization': 'Bearer ' + process.env.AUTH0_APIV2_TOKEN
        }
      };
      request(reqOpts,(error, response, body) => {
        if (error) {
          return reject(error);
        } else if (response.statusCode !== 200) {
          return reject('アカウントのリンク解除中にエラーが発生しました。ステータス: '+ response.statusCode + ' ' + JSON.stringify(body));
        } else {
          resolve(JSON.parse(body));
        }
      });
    });
  }
}

module.exports = new Auth0Client();`;

<AuthCodeBlock children={codeExample2} language="javascript" />

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

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