> ## 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 を使用して Auth0 ユーザーセッションを管理し、セッションメタデータの読み取り、カスタムセッション有効期間の設定、セッションの取り消しまたは延長を行います。

# Actions でのセッション

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

これを実現するために、post-login Actions には 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` オブジェクトはどちらも、[認可コードフロー](/docs/ja-jp/get-started/authentication-and-authorization-flow/authorization-code-flow)、Implicit Flow、デバイスコードフロー、さらに <Tooltip tip="Security Assertion Markup Language (SAML): パスワードなしで 2 者間の認証情報のやり取りを可能にする標準化されたプロトコル。" cta="用語集を表示" href="/docs/ja-jp/glossary?term=SAML">SAML</Tooltip> および <Tooltip tip="Security Assertion Markup Language (SAML): パスワードなしで 2 者間の認証情報のやり取りを可能にする標準化されたプロトコル。" cta="用語集を表示" href="/docs/ja-jp/glossary?term=WS-Fed">WS-Fed</Tooltip> を含む、対話型の Web ベースのフローをサポートしています。

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

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

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

* [Event object](/docs/ja-jp/customize/actions/explore-triggers/signup-and-login-triggers/login-trigger/post-login-event-object): セッションのイベントオブジェクトとそのプロパティについて説明します。
* [API object](/docs/ja-jp/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="/docs/ja-jp/glossary?term=refresh+tokens">リフレッシュトークン</Tooltip> を保持できるオプションも含まれています。

このメソッドは、セッションを取り消すだけでなく、現在のセッションに紐づくすべてのアプリケーションからユーザーをログアウトさせる `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()` は現在のトランザクションを拒否するだけでなく、セッションも取り消します。そのため、再度第1認証要素での認証が必要になります
</Callout>

<div id="monitor-revoke-log-events">
  ### 取り消しに関するログイベントを監視する
</div>

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

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

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

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

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

これらのメソッドを使うと、次の内容に基づいてセッションの有効期間や無操作ポリシーを動的にカスタマイズできます。

* ユーザーの organization
* ユーザーの 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 範囲について、ブラウザーを閉じた際に再認証を必須にする

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

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

| プロパティ            | 型      | 説明                                                     |
| ---------------- | ------ | ------------------------------------------------------ |
| `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の永続性を実装する方法については、[Sessions を使用してサインインしたままにするを設定する](/docs/ja-jp/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`

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

<div id="use-cases-revoke-a-session">
  ## ユースケース: セッションを取り消す
</div>

[Actions](/docs/ja-jp/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](/docs/ja-jp/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;

  // organizationに特定のアイドルタイムアウトが定義されている場合、タイムアウトを設定する
  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` を加えた値に設定します。
