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

# Actionsを使用したセッション

> Actionsを使ったセッションの管理について説明します。

[Actions](/docs/ja-jp/customize/actions)でセッションを使用すると、認証後のリスク検出と応答機能を構成して、アプリケーションとユーザーをセッションハイジャックから保護することができます。また、2[セッションライフタイム制限](/docs/ja-jp/manage-users/sessions/configure-session-lifetime-settings)を動的にカスタマイズすることもできます。

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

* **event.session**：一意の`id`、`created_at`、`expires_at`、`idle_expires_at`、`updated_at`の日付、`clients`、`authentication_at`の他にも、`ASN`、`IP`や`User_agent`などの`device`情報を含む、関連情報を提供します。
* **api.session：** セッションを取り消すか、`expiry`の日付を変更することで、既存のセッションを管理できます。

`event.session`と`api.session`オブジェクトは両方共に、authorization codeフロー、暗黙的フロー、デバイスコードフローを含む、インタラクティブなウェブベースのフローと、<Tooltip data-tooltip-id="react-containers-DefinitionTooltip-1" href="/docs/ja-jp/glossary?term=security-assertion-markup-language" tip="Security Assertion Markup Language（SAML）: パスワードなしに二者間で認証情報を交換できる標準化プロトコル。" cta="用語集の表示">SAML</Tooltip>および<Tooltip data-tooltip-id="react-containers-DefinitionTooltip-2" href="/docs/ja-jp/glossary?term=ws-fed" tip="Webサービスフェデレーション（WS-Fed）: ドメイン全体でユーザーIDを管理するためのプロトコル。" cta="用語集の表示">WS-Fed</Tooltip>をサポートします。

`event.session`オブジェクトを使用すると、最新のインタラクションのタイムスタンプを確認し、現在のトランザクションに関連するリスクを評価することができます。`event.session`オブジェクトを`event.authentication`や`event.request`など、他のイベントオブジェクトと組み合わせることもできます。

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

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

* [イベントオブジェクト](/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オブジェクトとメソッドについて説明します。

## Actionsでセッションを取り消す

ログイン後の**api.session.revoke(reason, options)** メソッドを使用すると、トランザクションに関連するリスクに対処することができます。このメソッドには、取り消されたトランザクションにバインドされているリフレッシュトークンを保存できるオプションが含まれています。

セッションを無効にするだけでなく、このメソッドは`session-revoked`の[OIDCバックチャネルログアウトイニシエーター](/docs/ja-jp/authenticate/login/logout/back-channel-logout/oidc-back-channel-logout-initiators)も開始し、現在のセッションにバインドされているすべてのアプリケーションからユーザーをログアウトさせ、テナントログに[session\_revoked](/docs/ja-jp/deploy-monitor/logs/log-event-type-codes)イベントを記録します。

このメソッドでは以下を行うことができます。

* Auth0で現在のセッションのトランザクションを無効にする
* 現在のトランザクションを拒否する
* 一致する`session_id`値を持つ既存のセッションと関連する[リフレッシュトークン](/docs/ja-jp/secure/tokens/refresh-tokens)すべてを取り消す

  * これはカスタマイズ可能なオプションであり、取り消すのではなく、リフレッシュトークンの保持を選択することもできます。この操作は非同期的に実行され、最終的には整合します。

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  `api.session.revoke(reason,options)`メソッドを使用する場合には、event.session.idプロパティが存在することを確認してください。

  `api.access.deny()`とは異なり、`api.session.revoke()`は現在のトランザクションを拒否し、セッションも取り消すため、第一要素の認証を再実行する必要があります。
</Callout>

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

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

関連する`session_id`属性と取り消されたセッションを示す`session_revoked`イベントコード。

## Actionsでセッションの有効期限日を変更する

セッションの[有効期限日](/docs/ja-jp/manage-users/sessions/session-lifetime-limits)を変更するには、以下のポストログインメソッドを使用します。

* **api.session.setExpiresAt(absolute)** を使用すると、特定のセッションに新しい絶対的な（後からログインが必要な）セッション有効期限を定義できます。
* **api.session.setIdleExpiresAt(idle)** を使用すると、特定のセッションに新しい非アクティブタイムアウトの日付を設定できます。

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

* ユーザーの組織
* ユーザーのAuth0接続
* 特定ユーザーのグループメンバーシップまたはプロファイル
* リスク評価
* Actionsの実行中に使用できる他の動的基準

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  `api.session.setExpiresAt(absolute)`メソッドおよび`api.session.setIdleExpiresAt(idle)`メソッドを使用する場合は、`event.session.id`などのevent.sessionオブジェクトのプロパティが存在することを確認してください。

  `api.session.setIdleExpiresAt(idle)`メソッドは、現在のインタラクションのセッション非アクティブタイムアウトを設定します。メソッドが再適用されない場合、後続の成功したインタラクションは、セッション非アクティブタイムアウト設定を使用して非アクティブタイムアウトを上書きします。
</Callout>

## 制限事項

ログイン後APIメソッドの`api.session.setExpiresAt(absolute)`と`api.session.setIdleExpiresAt(idle)`がリリースされる前に発行されたセッションには、次のevent.sessionプロパティは含まれません：`last_interacted_at`。

ログイン後APIメソッドの`api.session.revoke(reason, options)`がリリースされる前に発行されたセッションには、以下のevent.session.deviceプロパティは含まれません。

* `initial_ip`
* `initial_asn`
* `initial_user_agent`

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

## ユースケース：セッションを取り消す

[Actions](/docs/ja-jp/customize/actions)を使用すると、リスク検出を構成して、危険なセッションと関連するリフレッシュトークンをポストログインの`api.session.revoke(reason, options)`メソッドと`event.session`オブジェクトを使って取り消すことができます。

### ASNネットワークバインディングによるセッションの取り消し

ログイン後オブジェクトプロパティの`event.session.device.initial_asn`および`event.request.asn`を使用して、その期間中セッショントランザクションと特定の[autonomous system number (ASN)](https://www.arin.net/resources/guide/asn/)ネットワークをバインドして、ASNネットワークが変更した場合は再認証を要求できます。

```javascript lines theme={null}
exports.onExecutePostLogin = async (event, api) => {
  const sessionInitialAsn = event.session?.device?.initial_asn;
  const sessionCurrentAsn = event.request.asn;

  // if there is a session and the ASN changes
  if (
    sessionInitialAsn &&
    sessionCurrentAsn &&
    sessionInitialAsn != sessionCurrentAsn
  ) {
    api.session.revoke( "Invalid network change. Login again from a trusted network" )
  }
};
```

この例では、Actionの開始時点に、`event.session.device.initial_asn`および`event.request.asn`プロパティが、トランザクション中、同じASNネットワークを維持しているか検証するために確認が行われます。この確認に失敗すると、Actionは`api.session.revoke()`を呼び出して以下を実行します。

* セッションを無効にする
* 現在のトランザクションを拒否する
* 関連するリフレッシュトークンすべてを取り消す
* 再認証を促す

### IPバインディングによるセッションの取り消し

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

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

  // if there is a session and the IP changes
  if (
    sessionInitialIp &&
    sessionCurrentIp &&
    sessionInitialIp != sessionCurrentIp
  ) {
    api.session.revoke("Invalid IP change")
  }
};
```

この例では、Actionの開始時点に、`event.session.device.initial_ip`および`event.request.ip`プロパティが、トランザクション中、同じIPアドレスを維持しているか検証するために確認が行われます。この確認に失敗すると、Actionは`api.session.revoke()`を呼び出して以下を実行します。

* セッションを無効にする
* 現在のトランザクションを拒否する
* 関連するリフレッシュトークンすべてを取り消す
* 再認証を促す

## ユースケース：セッションの有効期限日をカスタマイズする

[Actions](/docs/ja-jp/customize/actions)を使用して、セッションのアイドルと絶対的な有効期限日をカスタマイズできます。特に、ログイン後の`api.session.setExpiresAt(absolute)`と`api.session.setIdleExpiresAt(idle)`メソッド、および`event.session`オブジェクトを使用して、ある特定のセッショントランザクションの有効期限日を構成できます。

### 接続に基づいて絶対的なセッション有効期限時間をカスタマイズする

以下のログイン後オブジェクトプロパティを使用すると、ユーザーの認証に使用される接続に対してライフタイムを定義できます。

* event.session.created\_at
* event.session.expires\_at

また、Auth0 [Management API](https://auth0.com/docs/api/management/v2/connections/patch-connections-by-id)を使用して接続メタデータの`event.connection.metadata.session_timeout`を作成し、特定の接続タイムアウトを定義します。

```javascript lines theme={null}
exports.onExecutePostLogin = async (event, api) => {
  const created = Date.parse(event.session?.created_at ?? "");

  // desired session lifetime for this connection in milliseconds, configured as connection metadata
  const connection_lifetime = event.connection?.metadata?.session_timeout;

  // if there is a session lifetime defined for the connection, set it
  if (event.session?.id && connection_lifetime) {
    api.session.setExpiresAt(created + Number(connection_lifetime));
  }
};
```

この例では、Actionの開始時点でチェックが行われ、現在の接続で`session_timeout`が定義されているかどうか検証されます。定義されている場合、Actionはセッションの`created`日＋`connection_lifetime`と等しくなるようにセッションの有効期限を設定します。

### Organizationに基づいてセッションの非アクティブタイムアウトをカスタマイズする

`current_time`変数を定義し、`idle_session_timeout`という新しいOrganizationメタデータを使用して、組織に希望するアイドルタイムアウトを設定できます。

```javascript lines theme={null}
exports.onExecutePostLogin = async (event, api) => {
  // The Organization metadata is configured with a shorter idle timeout for sessions (in milliseconds)
  const idle_organization_lifetime =
    event.organization?.metadata?.idle_session_timeout;

  // If the organization has an specific idle timeout defined, set the timeout
  if (event.session?.id && idle_organization_lifetime) {
    const current_time = new Date().getTime();

    api.session.setIdleExpiresAt(
      current_time + Number(idle_organization_lifetime),
    );
  }
};
```

この例では、Organizationに対して特定のアイドルタイムアウトが定義されている場合、アクションは`current_time`＋`idle_organization_lifetime`と等しくなるようにセッションの非アクティブタイムアウトを設定します。
