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

> Actions でセッションを管理する方法について説明します

# Actions でのセッション

[Actions](/ja/docs/customize/actions) で Sessions を使用すると、認証後のリスク検知機能と対応機能を設定し、セッションハイジャックからアプリケーションとユーザーを保護できます。[セッションの有効期間制限](/ja/docs/manage-users/sessions/configure-session-lifetime-settings)を動的にカスタマイズすることもできます。

このために、post-login Action には 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` オブジェクトはいずれも、[認可コードフロー](/ja/docs/get-started/authentication-and-authorization-flow/authorization-code-flow)、インプリシットフロー、デバイスコードフローに加え、<Tooltip tip="Security Assertion Markup Language (SAML): パスワードなしで 2 者間の認証情報の交換を可能にする標準化されたプロトコル。" cta="用語集を表示" href="/ja/docs/glossary?term=SAML">SAML</Tooltip> および <Tooltip tip="Security Assertion Markup Language (SAML): パスワードなしで 2 者間の認証情報の交換を可能にする標準化されたプロトコル。" cta="用語集を表示" href="/ja/docs/glossary?term=WS-Fed">WS-Fed</Tooltip> を含む、インタラクティブな Web ベースのフローをサポートしています。

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

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

これらのオブジェクトの詳細については、次を参照してください。

* [Event object](/ja/docs/customize/actions/explore-triggers/signup-and-login-triggers/login-trigger/post-login-event-object): セッション Event オブジェクトとそのプロパティについて説明します。
* [API object](/ja/docs/customize/actions/explore-triggers/signup-and-login-triggers/login-trigger/post-login-api-object): セッション API オブジェクトとそのメソッドについて説明します。

<div id="revoke-sessions-with-actions">
  ## Actions を使用したセッションの失効
</div>

post-login の **api.session.revoke(reason, options)** メソッドを使用すると、トランザクションに関連するリスクに対処できます。このメソッドには、失効されたトランザクションに紐づく <Tooltip tip="リフレッシュトークン: ユーザーに再度ログインさせることなく、新しいアクセストークンを取得するために使用されるトークン。" cta="用語集を表示" href="/ja/docs/glossary?term=refresh+tokens">リフレッシュトークン</Tooltip> を保持できるオプションも含まれています。

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

このメソッドは次の目的で使用できます。

* Auth0 で現在のセッショントランザクションを無効化する
* 現在のトランザクションを拒否する
* `session_id` の値が一致する既存のセッションに関連付けられたすべての[リフレッシュトークン](/ja/docs/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>

<div id="monitor-revoke-log-events">
  ### 失効ログイベントを監視する
</div>

失効操作を行うと、[テナントログ](/ja/docs/deploy-monitor/logs)に次のログイベントが追加されます。

関連する`session_id`属性を含む、失効されたセッションを示す`session_revoked`イベントコード。

<div id="change-sessions-expiry-dates-with-actions">
  ## Actions でセッションの有効期限を変更する
</div>

次の post-login メソッドを使用すると、セッションの[有効期限](/ja/docs/manage-users/sessions/session-lifetime-limits)を変更できます。

* **api.session.setExpiresAt(absolute)** を使用すると、指定したセッションの新しい絶対有効期限 (再ログインが必要になる日時) を定義できます。
* **api.session.setIdleExpiresAt(idle)** を使用すると、指定したセッションの新しい無操作タイムアウト日時を設定できます。

これらのメソッドを使用すると、次の要素に応じてセッションの有効期間と無操作ポリシーを動的にカスタマイズできます。

* ユーザーの組織
* ユーザーの Auth0 接続
* 特定のユーザーのグループ所属またはプロフィール
* リスク評価
* Action の実行中に利用できるその他の動的な条件

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

<div id="set-session-cookie-persistence-with-actions">
  ## Actions でセッション Cookie の永続性を設定する
</div>

post-login の **api.session.setCookieMode(options)** メソッドを使用すると、セッション Cookie の永続性を変更できます。セッション Cookie を永続化するか、非永続化するかを設定できます。

非永続 (エフェメラル) セッションは、メモリ内にのみ存在するため、セキュリティの向上に役立ちます。これらのセッションはブラウザーまたはアプリケーションを閉じると消去されるため、信頼できないデバイスからのアクセスやステップアップ認証のシナリオなど、機密性の高いワークフローに適しています。

このメソッドは、次の目的で使用できます。

* 高リスクのロールまたはグループに属するユーザーに対して、エフェメラルセッションを強制する

* 特定のデバイスまたは IP 範囲について、ブラウザーを閉じた際に再認証を必須にする

* 信頼できない環境または共有環境 (例: 公共のコンピューター) では、セッションの有効期間を短縮する

このメソッドは、次のパラメーターを受け取ります。

| Property         | Type   | Description                                          |
| ---------------- | ------ | ---------------------------------------------------- |
| `persistent`     | string | セッションは永続 Cookie に保存され、手動で消去しない限り、ブラウザーを再起動しても維持されます。 |
| `non-persistent` | string | セッションはメモリ内にのみ保存され、ブラウザーまたはアプリケーションを閉じると消去されます。       |

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  `api.session.setCookieMode()` メソッドは、現在のセッションに対してデフォルトのテナント設定を上書きします。

  Auth0 はこの永続性設定をセッション全体にわたって保持するため、以降のサイレント認証フローで再度設定する必要はありません。

  `api.session.setCookieMode()` メソッドは、post-login Action 内で使用する必要があります。`api.session` を使用できないコンテキストで使用すると、呼び出しは黙って失敗します。
</Callout>

セッション Cookie の永続性の実装方法については、[Configure Keep Me Signed In using Sessions](/ja/docs/manage-users/sessions/configure-keep-me-signed-in-sessions) を参照してください。

<div id="limitations">
  ## 制限事項
</div>

post-login API メソッド `api.session.setExpiresAt(absolute)` および `api.session.setIdleExpiresAt(idle)` のリリース前に発行されたセッションには、次の `event.session` プロパティが含まれません: `last_interacted_at.`

post-login API メソッド `api.session.revoke(reason, options)` のリリース前に発行されたセッションには、次の `event.session.device` プロパティが含まれません:

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

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

<div id="use-cases-revoke-a-session">
  ## ユースケース: セッションを失効させる
</div>

[Actions](/ja/docs/customize/actions) を使用すると、リスク検知を設定し、post-login の `api.session.revoke(reason, options)` メソッドと `event.session` オブジェクトを使って、リスクの高いセッションとそれに関連付けられたリフレッシュトークンを失効させることができます。

<div id="revoke-a-session-due-to-asn-network-binding">
  ### ASN ネットワーク バインディングによるセッションの失効
</div>

post-login オブジェクトのプロパティ `event.session.device.initial_asn` と `event.request.asn` を使用すると、セッションのトランザクションを有効期間中は特定の[自律システム番号 (ASN) ](https://www.arin.net/resources/guide/asn/)ネットワークにバインドし、ASN ネットワークが変更された場合に再認証を要求できます。

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

  // セッションが存在し、ASNが変更された場合
  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()` を呼び出して次を実行します。

* セッションを無効化する
* 現在のトランザクションを拒否する
* 関連付けられているすべてのリフレッシュトークンを失効させる
* 再認証を要求する

<div id="revoke-a-session-due-to-an-ip-binding">
  ### IP バインディングによってセッションを失効させる
</div>

post-login オブジェクトのプロパティ `event.session.device.initial_ip` と `event.request.ip` を使用すると、セッションのトランザクションが有効期間を通じて同じ IP アドレスに維持されていることを確認できます。このシナリオでは、IP アドレスの変更はリスクと見なされ、ユーザーには再認証が求められます。

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

  // セッションが存在し、IPアドレスが変更された場合
  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()` を呼び出して、以下を実行します。

* セッションを無効化する
* 現在のトランザクションを拒否する
* 関連付けられたすべてのリフレッシュトークンを失効させる
* 再認証を求める

<div id="use-cases-customize-a-session-expiry-dates">
  ## ユースケース: セッションの有効期限をカスタマイズする
</div>

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

<div id="customize-absolute-session-expiration-time-based-on-connections">
  ### 接続に応じてセッションの絶対有効期限をカスタマイズする
</div>

次の post-login オブジェクトのプロパティを使用して、ユーザーの認証に使用される接続の有効期間を定義できます。

* 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` で接続ごとのタイムアウトを定義できます。

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

  // この接続の希望するセッション有効期間（ミリ秒単位）、接続メタデータとして設定
  const connection_lifetime = event.connection?.metadata?.session_timeout;

  // 接続にセッション有効期間が定義されている場合は設定する
  if (event.session?.id && connection_lifetime) {
    api.session.setExpiresAt(created + Number(connection_lifetime));
  }
};
```

この例では、Action の冒頭で、現在の接続に `session_timeout` が定義されているかどうかを確認します。その場合、Action はセッションの有効期限を、セッションの `created` 時刻に `connection_lifetime` を加えた時刻に設定します。

<div id="customize-session-inactivity-timeout-based-on-the-organization">
  ### 組織に応じてセッションの非アクティブタイムアウトをカスタマイズする
</div>

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

```js lines theme={null}
exports.onExecutePostLogin = async (event, api) => {
  // 組織のメタデータには、セッションのアイドルタイムアウトが短く設定されています（ミリ秒単位）
  const idle_organization_lifetime =
    event.organization?.metadata?.idle_session_timeout;

  // 組織に特定のアイドルタイムアウトが定義されている場合はタイムアウトを設定する
  if (event.session?.id && idle_organization_lifetime) {
    const current_time = new Date().getTime();

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

この例では、組織に対して特定のアイドルタイムアウトが定義されている場合、Action はセッションの非アクティブタイムアウトを `current_time` と `idle_organization_lifetime` の合計値に設定します。
