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

# トークン

> IDと認証に関連したトークンの種類と、それらがAuth0でどのように使用されるかを説明します。

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

IDに関連したトークンには、IDトークンとアクセストークンの2種類があります。

## IDトークン

[IDトークン](/docs/ja-jp/secure/tokens/id-tokens)は、アプリケーションでのみ使用される[JSON Web Token（JWT）](/docs/ja-jp/secure/tokens/json-web-tokens)です。たとえば、ユーザーのログインにGoogleを使用して、カレンダーを同期させるアプリの場合、Googleはユーザーに関する情報を含むIDトークンをアプリに送信します。その後、このアプリは[トークンの内容](https://openid.net/specs/openid-connect-core-1_0.html#StandardClaims)を解析し、その情報（名前やプロファイル画像などの詳細を含む）を使ってユーザーエクスペリエンスをカスタマイズします。

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  IDトークンに含まれる情報を使用する前に、必ず[IDトークンを検証](/docs/ja-jp/secure/tokens/id-tokens/validate-id-tokens)してください。この作業には[ライブラリー](https://jwt.io/#libraries-io)が便利です。
</Callout>

IDトークンを使ってAPIにアクセス**してはいけません** 。各トークンには、意図されたオーディエンス（通常は受信者）についての情報が含まれています。<Tooltip data-tooltip-id="react-containers-DefinitionTooltip-0" href="/docs/ja-jp/glossary?term=openid" tip="OpenID: アプリケーションがログイン情報を収集および保存することなくにユーザーのIDを検証できるようにする認証用のオープン標準。" cta="用語集の表示">OpenID</Tooltip> Connectの仕様によると、IDトークンのオーディエンス（**aud** クレームで示される）は、認証を要求しているアプリケーションのクライアントIDでなければなりません。そうでない場合は、そのトークンを信頼してはいけません。

デコードされたIDトークンの内容は、以下のようになります。

export const codeExample1 = `{
  "iss": "http://{yourDomain}/",
  "sub": "auth0|123456",
  "aud": "{yourClientId}",
  "exp": 1311281970,
  "iat": 1311280970,
  "name": "Jane Doe",
  "given_name": "Jane",
  "family_name": "Doe",
  "gender": "female",
  "birthdate": "0000-10-31",
  "email": "janedoe@example.com",
  "picture": "http://example.com/janedoe/me.jpg"
}`;

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

このトークンはアプリケーションに対してユーザーを認証します。トークンのオーディエンス（ **aud** クレーム）はアプリケーションの識別子に設定されています。つまり、この特定のアプリケーションのみが、このトークンを使用すべきであることを意味します。

逆に言うと、APIは**aud** 値がAPIの一意の識別子と一致するトークンを予期しています。したがって、アプリケーションとAPIの両方を管理しない限り、IDトークンをAPIに送信しても通常はうまく行きません。IDトークンはAPIによって署名されていないため、APIがIDトークンを受け入れる場合、アプリケーションがトークンを変更したか（例：スコープを追加）を判断する方法がありません。詳しくは、『[JWTハンドブック](https://auth0.com/resources/ebooks/jwt-handbook)』を参照してください。

## アクセストークン

[アクセストークン](/docs/ja-jp/secure/tokens/access-tokens)（常に<Tooltip data-tooltip-id="react-containers-DefinitionTooltip-3" href="/docs/ja-jp/glossary?term=json-web-token" tip="JSON Web Token（JWT）: 二者間のクレームを安全に表現するために使用される標準IDトークン形式（および多くの場合、アクセストークン形式）。" cta="用語集の表示">JWT</Tooltip>とは限らない）は、APIへのアクセスと（付与された**スコープ** で指定された）所定のアクションの実行が、トークンの持参人に認可されていることをAPIに知らせるために使用されます。

上記のGoogleの例では、ユーザーがログインし、アプリによるGoogleカレンダーでの読み書きに同意すると、Googleがアプリにアクセストークンを送信します。アプリがGoogleカレンダーに書き込む場合は、HTTP**認可** ヘッダーにアクセストークンを含めて、Google Calendar APIに要求を送信します。

アクセストークンは、**絶対に** [認証](/docs/ja-jp/authenticate)に使用してはいけません。アクセストークンはユーザーが認証済みかを判断できません。アクセストークンが持っているユーザー情報は、**sub** クレームに含まれるユーザーIDだけです。アクセストークンはAPIのためのものであり、アプリケーションはアクセストークンを不透明な文字列として扱わなければなりません。アプリケーションはこれらをデコードしようとしたり、トークンを特定の形式で受け取ることを予期したりできません。

以下はアクセストークンの例です。

export const codeExample2 = `{
  "iss": "https://{yourDomain}/",
  "sub": "auth0|123456",
  "aud": [
    "my-api-identifier",
    "https://{yourDomain}/userinfo"
  ],
  "azp": "{yourClientId}",
  "exp": 1489179954,
  "iat": 1489143954,
  "scope": "openid profile email address phone read:appointments"
}`;

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

ID（**sub** クレーム）を除いて、ユーザーに関する情報がトークンに含まれていないことに注意してください。トークンには、アプリケーションがAPIで実行できるアクションについての認可情報（**スコープ** クレーム）のみが含まれています。この点で、アクセストークンはAPIのセキュリティ保護に役立ちますが、ユーザーの認証には適していません。

場合によっては、アクセストークンにsubクレーム以外のユーザー情報を追加したり、カスタムクレームを含めたりする方が、ユーザーの詳細取得にAPIの余分な処理を省くため、望ましいこともあります。これを行う場合には、これら追加のクレームがアクセストークンで読み取り可能なことに留意してください。詳細については、「[カスタムクレームを作成する](/docs/ja-jp/secure/tokens/json-web-tokens/create-custom-claims)」をお読みください。

## 特殊なトークン

Auth0のトークンベースの認証シナリオでは、以下の3つの特殊なトークンが使用されています。

* **リフレッシュトークン** ：ユーザーを再認証することなく、更新されたアクセストークンを取得するために使用されます。
* **<Tooltip data-tooltip-id="react-containers-DefinitionTooltip-2" href="/docs/ja-jp/glossary?term=idp" tip="IDプロバイダー（IdP）: デジタルIDを保存および管理するサービス。" cta="用語集の表示">IDP</Tooltip>アクセストークン** ：ユーザーの認証後にIDプロバイダーが発行するアクセストークンで、サードパーティのAPIを呼び出すことができます。
* **Auth0 <Tooltip data-tooltip-id="react-containers-DefinitionTooltip-0" href="/docs/ja-jp/glossary?term=management-api" tip="Management API: 顧客が管理タスクを実行できるようにするための製品。" cta="用語集の表示">Management API</Tooltip>のアクセストークン** ：特定のクレーム（スコープ）を含む、短期間だけ有効なトークンで、Management APIエンドポイントを呼び出すことができます。

## もっと詳しく

* [JSON Webトークン](/docs/ja-jp/secure/tokens/json-web-tokens)
* [IDトークン](/docs/ja-jp/secure/tokens/id-tokens)
* [アクセストークン](/docs/ja-jp/secure/tokens/access-tokens)
* [リフレッシュトークン](/docs/ja-jp/secure/tokens/refresh-tokens)
* [トークンストレージ](/docs/ja-jp/secure/security-guidance/data-security/token-storage)
* [トークンのベストプラクティス](/docs/ja-jp/secure/tokens/token-best-practices)
