> ## Documentation Index
> Fetch the complete documentation index at: https://auth0.com/llms.txt
> Use this file to discover all available pages before exploring further.

# アクションを使用したリフレッシュトークン

> アクションを使ったリフレッシュトークンの管理について説明します。

<Warning>
  現在、アクションを使ったリフレッシュトークンはプライベート早期アクセスの段階であり、エンタープライズプランのお客様が利用できます。この機能へのアクセスは、担当の技術アカウント管理者（TAM）を通じてリクエストできます。Auth0のリリース段階については、「[製品のリリース段階](/docs/ja-jp/troubleshoot/product-lifecycle/product-release-stages)」をお読みください。
</Warning>

リフレッシュトークンに[アクション](/docs/ja-jp/customize/actions)を使用すると、認証後のリスク検出と応答機能を構成して、アプリケーションとユーザーを侵害されたリフレッシュトークンから保護することができます。[リフレッシュトークンの有効期限](/docs/ja-jp/secure/tokens/refresh-tokens/configure-refresh-token-expiration)を動的にカスタマイズすることもできます。

* **event.refresh\_token** ：`creation`、`expiry dates`、`associated clients`、`resource servers`、`device`のコンテキストなどの関連情報と、ブラウザーベースのフローに`session_id`を提供します。
* **api.refreshToken** ：セッションを取り消すか、有効期限日を変更することで、既存のリフレッシュトークンを管理することができます。

これを容易にするために、ログイン後のアクションには以下の2つの重要なオブジェクトがあります。

event.refresh\_tokenとapi.refreshTokenオブジェクトは両方とも、[リフレッシュトークンの交換トランザクション](/docs/ja-jp/secure/tokens/refresh-tokens/use-refresh-token-rotation)に対応しています。

`event.refresh_token`オブジェクトを使用すると、`last_exchange_at`プロパティを確認し、現在のトランザクションに関してリスクを評価することができます。`event.refresh_token`オブジェクトを`event.authentication`など、他のイベントオブジェクトと組み合わせることもできます。

* [イベントオブジェクト](/docs/ja-jp/customize/actions/explore-triggers/signup-and-login-triggers/login-trigger/post-login-event-object)：フレッシュトークンのイベントオブジェクトとプロパティについて説明します。
* [APIオブジェクト](/docs/ja-jp/customize/actions/explore-triggers/signup-and-login-triggers/login-trigger/post-login-api-object)：フレッシュトークンのAPIオブジェクトとメソッドについて説明します。

## アクションでリフレッシュトークンを取り消す

`api.refreshToken`オブジェクトを使用して、既存のリフレッシュトークンの有効期限日をリセットするか、リフレッシュトークンを取り消すことができます。

これらのオブジェクトの詳細については、以下をご確認ください。

### イベントログの取り消しを監視する

ポストログインの **api.refreshToken.revoke(reason)** メソッドを使用すると、トランザクションに関したリスクに対処することができます。このメソッドでは以下を行うことができます。

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  `api.refresh_token(reason)`メソッドを使用したい場合は、event.refresh\_tokenのプロパティを必ず定義してください。
</Callout>

取り消し操作を行うと、[テナントログ](/docs/ja-jp/deploy-monitor/logs)に以下のログイベントが追加されます。

## アクションでリフレッシュトークンの有効期限日を変更する

リフレッシュトークンの取り消しを示す`srrt`イベントコード

* Auth0で現在のリフレッシュトークンのトランザクションを無効にする
* 403 HTTPステータスコードを返して、現在のトランザクションを拒否する

リフレッシュトークンが以前に認証されたセッションにバインドされている場合、ログには、`session_id`属性に認証済みセッションへの参照が含まれます。

* **api.refreshToken.setExpiresAt(Date)** は、特定のリフレッシュトークンに新しい絶対ライフタイムを定義できるようにします。
* **api.refreshToken.setIdleExpiresAt(Date)** は、特定のリフレッシュトークンに新しい非アクティブタイムアウトを設定できるようにします。
* 特定ユーザーのグループメンバーシップまたはプロファイル
* リスク評価
* アクションの実行中に使用できる他の動的条件

リフレッシュトークンの有効期限日を変更するには、以下のポストログインメソッドを使用します。

## 制限事項

これらのメソッドを使用すると、以下を基に、リフレッシュトークンのライフタイムと非アクティブポリシーを動的にカスタマイズすることができます。

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  `api.refreshToken.setExpiresAt(absolute)`メソッドと`api.refreshToken.setIdleExpiresAt(idle)`メソッドを使用すると、発行前にリフレッシュトークンの有効期限を定義したり、[リフレッシュトークン交換](/docs/ja-jp/secure/tokens/refresh-tokens/use-refresh-tokens)フロー中にリフレッシュトークンに既存の有効期限を変更したりできます。

  `api.refreshToken.setExpiresAt(absolute)`メソッドと`api.refreshToken.setIdleExpiresAt(idle)`メソッドは、[リフレッシュトークン有効期限](/docs/ja-jp/secure/tokens/refresh-tokens/configure-refresh-token-expiration)のデフォルト設定を最大値として使用し、有効期限のないリフレッシュトークンを有効期限のあるリフレッシュトークンに変換します。

  `api.refreshToken.setIdleExpiresAt(idle)`は、リフレッシュトークンの非アクティブタイムアウトを設定します。正常な交換でこのメソッドが呼び出されない場合には、アプリケーション設定にあるリフレッシュトークンのライフタイムを使って、非アクティブタイムアウトが上書きされます。
</Callout>

2023年9月21日以降に発行されたリフレッシュトークン（US-3リ－ジョンのテナントの場合は2024年2月22日）には、適切な値を持つセッションID（`session_id`）プロパティが含まれます。この日付よりも前に発行されたリフレッシュトークンには、`null`値を持つこのプロパティが含まれます。

ポストログインAPIメソッドの`api.refreshToken.revoke(reason)`がリリースされる前に発行されたリフレッシュトークンには、`event.refresh_token.device`情報は含まれません。

## ユースケース：リフレッシュトークンを取り消す

無期限のリフレッシュトークンや未交換のリフレッシュトークンには、`event.refresh_token.last_exchanged_at`プロパティは含まれません。

### ImpossibleTravelによるトークンの取り消し

セキュリティ上の理由から、非アクティブタイムアウトと絶対タイムアウトを、[リフレッシュトークンの有効期限日](/docs/ja-jp/secure/tokens/refresh-tokens/configure-refresh-token-expiration)で定義されたアプリケーションのフレッシュトークンの設定を超えた値には設定できません。有効期限日を超えた日付を設定しようとすると、APIメソッドは[リフレッシュトークンの有効期限](/docs/ja-jp/secure/tokens/refresh-tokens/configure-refresh-token-expiration)まで更新し、テナントログに警告イベント（`w`）を記録します。

[アクション](/docs/ja-jp/customize/actions)を使用すると、リスク検出を構成して、リフレッシュトークンを`api.refreshToken.revoke(reason)`メソッドとイベントオブジェクトを使って取り消すことができます。

<Tooltip data-tooltip-id="react-containers-DefinitionTooltip-4" href="/docs/ja-jp/glossary?term=adaptive-multi-factor-authentication" tip="Adaptive Multifactor Authentication: ログイン試行が信頼性の低いログインであると判断された場合にのみ、ユーザーに対してトリガーされる多要素認証（MFA）。" cta="用語集の表示">Adaptive MFA</Tooltip>の[アセスメント](https://auth0.com/docs/secure/multi-factor-authentication/adaptive-mfa/customize-adaptive-mfa#assessments-object)オブジェクトを使用すると、ユーザーがImpossibleTravelを示す場所からログインしているか判定し、そのトランザクションに関連付けられた現在のリフレッシュトークンを取り消すことができます。

* ユーザーの組織
* ユーザーのAuth0接続
* 特定ユーザーのグループメンバーシップまたはプロファイル
* リスク評価

### IPバインディングによるリフレッシュトークンの取り消し

```javascript lines theme={null}
exports.onExecutePostLogin = async (event, api) => {
  const { riskAssessment } = event.authentication ?? {};
  const ImpossibleTravel = riskAssessment?.assessments.ImpossibleTravel;

  // If this is an impossible travel and this is a refresh token exchange
  if (ImpossibleTravel?.code === "impossible_travel_from_last_login") {
    if (event.refresh_token) {
      api.refreshToken.revoke("Refresh token revoked due to impossible travel");
    }
  }
};
```

この例では、アクションの開始時点で`event.authentication.ImpossibleTravel.code`が`impossible_travel_from_last_login`プロパティに等しいか検証されます。`true`の場合、アクションは`api.refreshToken.revoke()`を呼び出し、以下を行います。

ポストログインオブジェクトプロパティの`event.refresh_token.device.initial_ip`と`event.request.ip`を使って、その期間、リフレッシュトークンのトランザクションに同じIPアドレスが維持されるようにします。このシナリオでは、IPの変更はすべて危険だとみなされ、新しいリフレッシュトークンが要求されます。

* ユーザーの組織
* ユーザーのAuth0接続
* 「403 access\_denied」のエラー応答を返す
* 「<Tooltip data-tooltip-id="react-containers-DefinitionTooltip-1" href="/docs/ja-jp/glossary?term=refresh-token" tip="リフレッシュトークン: ユーザーに再度ログインを強いることなく、更新されたアクセストークンを取得するために使用されるトークン。" cta="用語集の表示">Refresh token</Tooltip> revoked due to impossible travel（impossible travelによりトークンが取り消されました）」というエラーを発行する

```javascript lines theme={null}
exports.onExecutePostLogin = async (event, api) => {
  const refreshTokenInitialIp = event.refresh_token?.device?.initial_ip;
  const requestCurrentIp = event.request.ip;

  // if there is a refresh token and the IP changes
  if (
    refreshTokenInitialIp &&
    requestCurrentIp &&
    refreshTokenInitialIp != requestCurrentIp
  ) {
    api.refreshToken.revoke("Invalid IP change");
  }
};
```

## ユースケース：リフレッシュトークンの有効期限日をカスタマイズする

この例では、アクションの開始時点で、`event.refresh_token.device.initial_ip`と`event.request.ip`のプロパティを使ってIPアドレスの追跡が確認されます。アクションは、トランザクションのIPアドレスが変更されたかを判定します。`true`の場合、アクションは`api.refreshToken.revoke()`を呼び出し、以下を行います。

### 組織を基にリフレッシュトークンの絶対有効期限日をカスタマイズする

または、制限の少ないアクションでは、`event.request.asn`プロパティと`event.refresh_token.device.initial_asn`プロパティを追跡し、IPの変更でなく、ASNの変更を監視することができます。

[アクション](/docs/ja-jp/customize/actions)を使用すると、リフレッシュトークンのライフタイムと非アクティブの日付をカスタマイズすることができます。具体的には、特定のトランザクションについて、リフレッシュトークンのアイドルTTLと絶対有効期限日を設定することができます。これには、ポストログインの`api.refreshToken.setExpiresAt(Date)`メソッドと`api.refreshToken.setIdleExpiresAt(Date)`メソッドを使用します。

以下のポストログインオブジェクトプロパティを使用すると、現在のトランザクションに関連付けられた組織について、リフレッシュトークンのライフタイムを定義することができます。

* トランザクションを拒否する
* リフレッシュトークンを取り消す

### メンバーシップロールを基にリフレッシュトークンの非アクティブタイムアウトをカスタマイズする

```javascript lines theme={null}
exports.onExecutePostLogin = async (event, api) => {
  // Refresh token timeout (in miliseconds) metadata configured in the Organizations
  const organization_refresh_token_lifetime =
    event.organization?.metadata?.refresh_token_timeout;

  if (organization_refresh_token_lifetime) {
    // Refresh token already exists
    if (event.refresh_token) {
      const created = Date.parse(event.refresh_token.created_at);

      const new_expiration_time =
        created + Number(organization_refresh_token_lifetime);
      api.refreshToken.setExpiresAt(new_expiration_time);
    } else {
      // Refresh token doesn't exist yet (e.g., token is being issued)
      const current_time = new Date().getTime();

      const new_expiration_time =
        current_time + Number(organization_refresh_token_lifetime);
      api.refreshToken.setExpiresAt(new_expiration_time);
    }
  }
};
```

この例では、アクションの開始時点で、リフレッシュトークンのライフタイムが`organization_refresh_token_lifetime`よりも長いかが検証されます。リフレッシュトークンのライフタイムの方がが長い場合、アクションはリフレッシュトークンの有効期限が「リフレッシュトークンの`作成`日+`organization_refresh_token_lifetime`」と等しくなるように設定します。

ポストログインオブジェクトプロパティの`event.refresh_token.last_exchanged_at`と `event.refresh_token.idle_expires_at`を使用すると、ユーザーのメンバーシップロールを基に、リフレッシュトークンの非アクティブタイムアウトを定義することができます。
