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

export const codeExample = `const auth0 = await createAuth0Client({
  domain: '{yourDomain}',
  client_id: '{yourClientId}',
  audience: '{yourApiIdentifier}',
  useRefreshTokens: true
});`;

Dashboardまたは[Auth0 SPA SDK](/docs/ja-jp/libraries/auth0-single-page-app-sdk)を使用して、アプリケーションごとにリフレッシュトークンのローテーションを構成します。リフレッシュトークンのローテーションが有効な場合、ユーザーはシームレスな遷移が可能となります。アプリケーションは、前の、有効期限がなくローテーションしないリフレッシュトークンを使用し、ローテーションするリフレッシュトークンに切り替えます。

ローテーションしないリフレッシュトークンからローテーションするリフレッシュトークンに移行する（またはその逆の）場合、トークンは自動的に失効します。

* **リフレッシュトークンのローテーションが有効な場合** ：
  ローテーションしないリフレッシュトークンを交換すると新しいリフレッシュトークンが発行され、同じ`client_id`、リソースサーバー、ユーザー、およびテナントに対して発行されたローテーションしないトークンがすべて削除されます。
* **リフレッシュトークンのローテーションが無効な場合** ：
  ローテーションするリフレッシュトークンを交換するとローテーションしないリフレッシュトークンが発行され、同じ`client_id`、リソースサーバー、ユーザー、およびテナントに対して発行されたローテーションするリフレッシュトークンファミリーが失効します。

## Dashboardで構成する

1. [［Dashboard］>［Applications（アプリケーション）］](https://manage.auth0.com/#/applications)に移動します。

2. 構成したいアプリケーションを選択します。

3. **［Settings（設定）］** タブに移動します。

4. **［Refresh Token Rotation（リフレッシュトークンのローテーション）］** で、**［Allow Refresh Token Rotation（リフレッシュトークンのローテーションを許可する）］** を有効にします。.

   <Frame>
     <img src="https://mintcdn.com/docs-dev-fix-docs-5528-php-updates/B5szgmwIMC3tCA41/docs/images/ja-jp/cdy7uua7fh8z/Rk6i8MUVWZG34P7K6aurb/2633d759038770c7cc6f82afff26d50f/2025-01-28_14-28-18.png?fit=max&auto=format&n=B5szgmwIMC3tCA41&q=85&s=7351eb4ccf46080b860fdba7279c9360" alt="Dashboard アプリケーション アプリケーション設定タブ リフレッシュトークンのローテーション" width="699" height="257" data-path="docs/images/ja-jp/cdy7uua7fh8z/Rk6i8MUVWZG34P7K6aurb/2633d759038770c7cc6f82afff26d50f/2025-01-28_14-28-18.png" />
   </Frame>

5. 自動再利用検出をトリガーする前に、要求と応答の間に時間の余裕を持たせるために、リフレッシュトークンに対して、**［Rotation Overlap Period（ローテーションのオーバーラップ期間）］** を秒単位で入力します。このオーバーラップ期間は、指定された時間枠内でローテーションするリフレッシュトークンを複数回にわたって交換するときに、同時実行の問題を回避するのに役立ちます。この期間中、侵害検出機能は適用されず、ローテーションする新しいリフレッシュトークンが発行されます。再利用できるのは直前のトークンのみです。最後から2番目のトークンが交換されると、侵害検出がトリガーされます。

6. **［Save Changes（変更の保存）］** を選択します。

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  リフレッシュトークンのローテーションは、リフレッシュトークンの付与タイプが有効化されているOIDC準拠のアプリケーションにのみ使用できます。
</Callout>

## Auth0 SPA SDKで構成する

Auth0 SPA SDKを使用して、リフレッシュトークンのローテーションを有効にすることができます。オフラインアクセスを有効にして、クライアントSDKでオフラインアクセスのスコープを要求しなければなりません。

1. 最新バージョンの`auth0-spa-js` SDKをインストールします：
   `npm install @auth0/auth0-spa-js`

2. SDKで機能を有効にするには、`offline_access`スコープの送信を開始するように`useRefreshTokens: true`を設定します。

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

3. リフレッシュトークンのローテーション設定を構成します。例：

   ```http lines theme={null}
   PATCH /api/v2/clients/{client_id}
   {
     "refresh_token": {
       "rotation_type": "rotating",
       "expiration_type": "expiring",
       "token_lifetime": "2592000",
       "leeway": 3
     }
   }
   ```

   \| 属性 | 説明 |
   \| --- | --- |
   \| `rotation_type` | テキスト文字列：rotatingまたはnon-rotating |
   \| `expiration_type` | テキスト文字列：expiringまたはnon-expiring |
   \| `token_lifetime` | **リフレッシュトークンのローテーション**が有効化されている場合、リフレッシュトークンのデフォルトの有効期限は30日（2,592,000秒）です。1年（31,557,600秒）までを構成することができます。**トークンがローテーションされても、ライフタイムは延長されません。** |
   \| `leeway` | 潜在的なネットワークの同時並行で、クライアントが同じリフレッシュトークンを使って再試行をした際にトークンが無効となり、動作不能になることを考慮して、指定の時間内に同じリフレッシュトークンが使用されることを許容します。デフォルトでは無効に設定されています。この余裕時間は秒単位で構成します。 |

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  リフレッシュトークンのローテーションは、リフレッシュトークンの付与タイプが有効化されているOIDC準拠のアプリケーションにのみ使用できます。
</Callout>

## 再利用の自動検出

前に無効になったトークンが使用されている場合は、その無効になったトークンが発行された以降に発行されたリフレッシュトークンの全セットが付与と同様に直ちに失効され、ユーザーの再認証が必要になります。

## もっと詳しく

* [リフレッシュトークンのローテーション](/docs/ja-jp/secure/tokens/refresh-tokens/refresh-token-rotation)
* [リフレッシュトークンのローテーションを使用する](/docs/ja-jp/secure/tokens/refresh-tokens/use-refresh-token-rotation)
* [リフレッシュトークンのローテーションを無効にする](/docs/ja-jp/secure/tokens/refresh-tokens/disable-refresh-token-rotation)
