Actions で Sessions を使用すると、認証後のリスク検知機能と対応機能を設定し、セッションハイジャックからアプリケーションとユーザーを保護できます。セッションの有効期間制限を動的にカスタマイズすることもできます。
このために、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 オブジェクトはいずれも、認可コードフロー、インプリシットフロー、デバイスコードフローに加え、 および を含む、インタラクティブな Web ベースのフローをサポートしています。
event.session オブジェクトを使用すると、直近のやり取りのタイムスタンプを確認し、現在のトランザクションに関連するリスクを評価できます。また、event.session オブジェクトは、event.authentication や event.request などの他のイベントオブジェクトと組み合わせて使用することもできます。
その後、api.session オブジェクトを使用して、既存のセッションの有効期限をリセットするか、セッションを失効させることができます。
これらのオブジェクトの詳細については、次を参照してください。
post-login の api.session.revoke(reason, options) メソッドを使用すると、トランザクションに関連するリスクに対処できます。このメソッドには、失効されたトランザクションに紐づく を保持できるオプションも含まれています。
このメソッドは、セッションを失効させるだけでなく、session-revoked OIDC Back-Channel Logout Initiator も開始し、現在のセッションに紐づくすべてのアプリケーションからユーザーをログアウトさせ、テナントログに session_revoked イベントを記録します。
このメソッドは次の目的で使用できます。
-
Auth0 で現在のセッショントランザクションを無効化する
-
現在のトランザクションを拒否する
-
session_id の値が一致する既存のセッションに関連付けられたすべてのリフレッシュトークンを失効させる。
- これはカスタマイズ可能なオプションです。リフレッシュトークンを失効させる代わりに保持することもできます。この操作は非同期で実行され、最終的に整合した状態になります。
api.session.revoke(reason,options) メソッドを使用する場合は、event.session.id プロパティが存在することを確認してください。api.access.deny() とは異なり、api.session.revoke() は現在のトランザクションを拒否するだけでなく、セッションも失効させます。そのため、再度第一要素の認証が必要になります
失効操作を行うと、テナントログに次のログイベントが追加されます。
関連するsession_id属性を含む、失効されたセッションを示すsession_revokedイベントコード。
次の post-login メソッドを使用すると、セッションの有効期限を変更できます。
- api.session.setExpiresAt(absolute) を使用すると、指定したセッションの新しい絶対有効期限 (再ログインが必要になる日時) を定義できます。
- api.session.setIdleExpiresAt(idle) を使用すると、指定したセッションの新しい無操作タイムアウト日時を設定できます。
これらのメソッドを使用すると、次の要素に応じてセッションの有効期間と無操作ポリシーを動的にカスタマイズできます。
- ユーザーの組織
- ユーザーの Auth0 接続
- 特定のユーザーのグループ所属またはプロフィール
- リスク評価
- Action の実行中に利用できるその他の動的な条件
api.session.setExpiresAt(absolute) メソッドと api.session.setIdleExpiresAt(idle) メソッドを使用する場合は、event.session.id などの event.session オブジェクトのプロパティが存在することを確認してください。api.session.setIdleExpiresAt(idle) メソッドは、現在のインタラクションに対するセッションの無操作タイムアウトを設定します。このメソッドを再適用しない場合、以降の正常なインタラクションでは、セッションの無操作タイムアウト設定によって無操作タイムアウトが上書きされます。
Actions でセッション Cookie の永続性を設定する
post-login の api.session.setCookieMode(options) メソッドを使用すると、セッション Cookie の永続性を変更できます。セッション Cookie を永続化するか、非永続化するかを設定できます。
非永続 (エフェメラル) セッションは、メモリ内にのみ存在するため、セキュリティの向上に役立ちます。これらのセッションはブラウザーまたはアプリケーションを閉じると消去されるため、信頼できないデバイスからのアクセスやステップアップ認証のシナリオなど、機密性の高いワークフローに適しています。
このメソッドは、次の目的で使用できます。
-
高リスクのロールまたはグループに属するユーザーに対して、エフェメラルセッションを強制する
-
特定のデバイスまたは IP 範囲について、ブラウザーを閉じた際に再認証を必須にする
-
信頼できない環境または共有環境 (例: 公共のコンピューター) では、セッションの有効期間を短縮する
このメソッドは、次のパラメーターを受け取ります。
| Property | Type | Description |
|---|
persistent | string | セッションは永続 Cookie に保存され、手動で消去しない限り、ブラウザーを再起動しても維持されます。 |
non-persistent | string | セッションはメモリ内にのみ保存され、ブラウザーまたはアプリケーションを閉じると消去されます。 |
api.session.setCookieMode() メソッドは、現在のセッションに対してデフォルトのテナント設定を上書きします。Auth0 はこの永続性設定をセッション全体にわたって保持するため、以降のサイレント認証フローで再度設定する必要はありません。api.session.setCookieMode() メソッドは、post-login Action 内で使用する必要があります。api.session を使用できないコンテキストで使用すると、呼び出しは黙って失敗します。
セッション Cookie の永続性の実装方法については、Configure Keep Me Signed In using Sessions を参照してください。
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
セキュリティ上の理由により、非アクティブタイムアウトおよび絶対タイムアウトは、テナントのセッションの有効期間制限で定義されたセッション設定の上限を超えて設定することはできません。セッションの有効期間制限を超える日付を設定しようとすると、API メソッドはその上限まで更新し、テナントログに警告イベント (w) を記録します。
Actions を使用すると、リスク検知を設定し、post-login の api.session.revoke(reason, options) メソッドと event.session オブジェクトを使って、リスクの高いセッションとそれに関連付けられたリフレッシュトークンを失効させることができます。
ASN ネットワーク バインディングによるセッションの失効
post-login オブジェクトのプロパティ event.session.device.initial_asn と event.request.asn を使用すると、セッションのトランザクションを有効期間中は特定の自律システム番号 (ASN) ネットワークにバインドし、ASN ネットワークが変更された場合に再認証を要求できます。
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() を呼び出して次を実行します。
- セッションを無効化する
- 現在のトランザクションを拒否する
- 関連付けられているすべてのリフレッシュトークンを失効させる
- 再認証を要求する
IP バインディングによってセッションを失効させる
post-login オブジェクトのプロパティ event.session.device.initial_ip と event.request.ip を使用すると、セッションのトランザクションが有効期間を通じて同じ IP アドレスに維持されていることを確認できます。このシナリオでは、IP アドレスの変更はリスクと見なされ、ユーザーには再認証が求められます。
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() を呼び出して、以下を実行します。
- セッションを無効化する
- 現在のトランザクションを拒否する
- 関連付けられたすべてのリフレッシュトークンを失効させる
- 再認証を求める
ユースケース: セッションの有効期限をカスタマイズする
Actions を使用すると、セッションのアイドル有効期限と絶対有効期限をカスタマイズできます。具体的には、post-login の api.session.setExpiresAt(absolute) メソッドと api.session.setIdleExpiresAt(idle) メソッド、および event.session オブジェクトを使用して、特定のセッション トランザクションの有効期限を設定できます。
接続に応じてセッションの絶対有効期限をカスタマイズする
次の post-login オブジェクトのプロパティを使用して、ユーザーの認証に使用される接続の有効期間を定義できます。
- event.session.created_at
- event.session.expires_at
また、Auth0 の Management API を使用して接続メタデータを作成すると、event.connection.metadata.session_timeout で接続ごとのタイムアウトを定義できます。
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 を加えた時刻に設定します。
組織に応じてセッションの非アクティブタイムアウトをカスタマイズする
current_time 変数を定義し、idle_session_timeout という新しい組織メタデータを使用することで、組織ごとに必要なアイドルタイムアウトを設定できます。
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 の合計値に設定します。