メインコンテンツへスキップ
Actionsでセッションを使用すると、認証後のリスク検出と応答機能を構成して、アプリケーションとユーザーをセッションハイジャックから保護することができます。また、2セッションライフタイム制限を動的にカスタマイズすることもできます。 これを容易にするために、ログイン後アクションには以下の2つの重要なオブジェクトがあります。
  • event.session:一意のidcreated_atexpires_atidle_expires_atupdated_atの日付、clientsauthentication_atの他にも、ASNIPUser_agentなどのdevice情報を含む、関連情報を提供します。
  • api.session: セッションを取り消すか、expiryの日付を変更することで、既存のセッションを管理できます。
event.sessionapi.sessionオブジェクトは両方共に、authorization codeフロー、暗黙的フロー、デバイスコードフローを含む、インタラクティブなウェブベースのフローと、およびをサポートします。 event.sessionオブジェクトを使用すると、最新のインタラクションのタイムスタンプを確認し、現在のトランザクションに関連するリスクを評価することができます。event.sessionオブジェクトをevent.authenticationevent.requestなど、他のイベントオブジェクトと組み合わせることもできます。 api.sessionオブジェクトを使用して、既存のセッションの有効期限日をリセットするか、セッションを取り消すことができます。 これらのオブジェクトの詳細については、以下をご確認ください。

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

ログイン後のapi.session.revoke(reason, options) メソッドを使用すると、トランザクションに関連するリスクに対処することができます。このメソッドには、取り消されたトランザクションにバインドされているリフレッシュトークンを保存できるオプションが含まれています。 セッションを無効にするだけでなく、このメソッドはsession-revokedOIDCバックチャネルログアウトイニシエーターも開始し、現在のセッションにバインドされているすべてのアプリケーションからユーザーをログアウトさせ、テナントログにsession_revokedイベントを記録します。 このメソッドでは以下を行うことができます。
  • Auth0で現在のセッションのトランザクションを無効にする
  • 現在のトランザクションを拒否する
  • 一致するsession_id値を持つ既存のセッションと関連するリフレッシュトークンすべてを取り消す
    • これはカスタマイズ可能なオプションであり、取り消すのではなく、リフレッシュトークンの保持を選択することもできます。この操作は非同期的に実行され、最終的には整合します。
api.session.revoke(reason,options)メソッドを使用する場合には、event.session.idプロパティが存在することを確認してください。api.access.deny()とは異なり、api.session.revoke()は現在のトランザクションを拒否し、セッションも取り消すため、第一要素の認証を再実行する必要があります。

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

取り消し操作を行うと、テナントログに以下のログイベントが追加されます。 関連するsession_id属性と取り消されたセッションを示すsession_revokedイベントコード。

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

セッションの有効期限日を変更するには、以下のポストログインメソッドを使用します。
  • api.session.setExpiresAt(absolute) を使用すると、特定のセッションに新しい絶対的な(後からログインが必要な)セッション有効期限を定義できます。
  • api.session.setIdleExpiresAt(idle) を使用すると、特定のセッションに新しい非アクティブタイムアウトの日付を設定できます。
これらのメソッドを使用すると、以下を基に、セッションのライフタイムと非アクティブポリシーを動的にカスタマイズすることができます。
  • ユーザーの組織
  • ユーザーのAuth0接続
  • 特定ユーザーのグループメンバーシップまたはプロファイル
  • リスク評価
  • Actionsの実行中に使用できる他の動的基準
api.session.setExpiresAt(absolute)メソッドおよびapi.session.setIdleExpiresAt(idle)メソッドを使用する場合は、event.session.idなどのevent.sessionオブジェクトのプロパティが存在することを確認してください。api.session.setIdleExpiresAt(idle)メソッドは、現在のインタラクションのセッション非アクティブタイムアウトを設定します。メソッドが再適用されない場合、後続の成功したインタラクションは、セッション非アクティブタイムアウト設定を使用して非アクティブタイムアウトを上書きします。

制限事項

ログイン後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
セキュリティ上の理由から、非アクティブタイムアウトと絶対タイムアウトを、テナントのセッションライフタイム制限で定義されたセッション設定を超えた値には設定できません。ライフタイム制限を超えた日付を設定しようとすると、APIメソッドはライフタイム制限に達するまで更新し、テナントログに警告イベント(w)を記録します。

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

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

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

ログイン後オブジェクトプロパティのevent.session.device.initial_asnおよびevent.request.asnを使用して、その期間中セッショントランザクションと特定のautonomous system number (ASN)ネットワークをバインドして、ASNネットワークが変更した場合は再認証を要求できます。
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_ipevent.request.ipを使って、その期間、セッションのトランザクションに同じIPアドレスが維持されるようにします。このシナリオでは、IPの変更はすべて危険だとみなされ、ユーザーは再認証を促されます。
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を使用して、セッションのアイドルと絶対的な有効期限日をカスタマイズできます。特に、ログイン後のapi.session.setExpiresAt(absolute)api.session.setIdleExpiresAt(idle)メソッド、およびevent.sessionオブジェクトを使用して、ある特定のセッショントランザクションの有効期限日を構成できます。

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

以下のログイン後オブジェクトプロパティを使用すると、ユーザーの認証に使用される接続に対してライフタイムを定義できます。
  • 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 ?? "");

  // 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メタデータを使用して、組織に希望するアイドルタイムアウトを設定できます。
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_timeidle_organization_lifetimeと等しくなるようにセッションの非アクティブタイムアウトを設定します。
I