を Actions と組み合わせて使用すると、認証後のリスク検出と対応機能を構成し、侵害されたリフレッシュトークンからアプリケーションとユーザーを保護できます。また、リフレッシュトークンの有効期限を動的にカスタマイズすることもできます。
このために、Post Login Actions には 2 つの主要なオブジェクトが用意されています。
- event.refresh_token: 既存の refresh_tokens に関する関連情報を提供します。これには、
id、created_at、expires_at、idle_expires_at、clients_id、ASN、IP、User_agent などの device 情報、およびブラウザベースのフローでは session_id が含まれます。このオブジェクトは、リフレッシュトークン交換フローで設定されます。
- api.refreshToken: セッションを無効化したり有効期限を変更したりして、既存のリフレッシュトークンを管理できます。
event.refresh_token オブジェクトを使用すると、last_exchange_at プロパティを確認し、現在のトランザクションに関連するリスクを評価できます。また、event.refresh_token オブジェクトを event.authentication などの他の event オブジェクトと組み合わせることもできます。
その後、api.refreshToken オブジェクトを使用して、リフレッシュトークンの有効期限を設定するか、リフレッシュトークンを無効化できます。
これらのオブジェクトの詳細については、以下を参照してください。
Actions でリフレッシュトークンを無効化する
post-login の api.refreshToken.revoke(reason) メソッドを使用すると、トランザクションに関連するリスクに対処できます。リフレッシュトークンを無効化すると、そのリフレッシュトークンは無効になり、現在のトランザクションを拒否するために HTTP ステータスコード 403 が返され、テナントログ (srrt) にリフレッシュトークンの無効化イベントが記録されます。
api.refreshToken.revoke(reason) メソッドを使用する場合は、event.refresh_token オブジェクトが存在することを確認してください。
無効化操作を実行すると、テナントログ に次のログイベントが追加されます。
リフレッシュトークンが無効化したことを示す srrt イベントコード。
リフレッシュトークンが以前に認証されたセッションに紐付いている場合、ログの session_id 属性に、その認証済みセッションへの参照が含まれます。
Actions でリフレッシュトークンの有効期限を変更する
次の post-login メソッドを使用すると、リフレッシュトークンの有効期限を変更できます。
- api.refreshToken.setExpiresAt(absolute) を使用すると、指定したリフレッシュトークンの新しい絶対有効期限を定義できます。
- api.refreshToken.setIdleExpiresAt(idle) を使用すると、指定したリフレッシュトークンの新しいアイドルタイムアウトの有効期限を設定できます。
これらのメソッドを使用すると、次の項目に基づいてリフレッシュトークンの有効期間やアイドルタイムアウト ポリシーを動的にカスタマイズできます。
- ユーザーの組織
- ユーザーの Auth0 接続
- 特定のユーザーのグループ メンバーシップまたはユーザープロファイル
- リスク評価
- Action の実行時に利用可能なその他の動的な条件
api.refreshToken.setExpiresAt(absolute) メソッドと api.refreshToken.setIdleExpiresAt(idle) メソッドを使用すると、リフレッシュトークンの発行前に有効期限を定義したり、リフレッシュトークンの交換 フロー中に既存のリフレッシュトークンの有効期限を変更したりできます。api.refreshToken.setExpiresAt(absolute) メソッドと api.refreshToken.setIdleExpiresAt(idle) メソッドは、デフォルトの リフレッシュトークンの有効期限 設定を最大値として使用し、有効期限のないリフレッシュトークンを有効期限付きのリフレッシュトークンに変換します。api.refreshToken.setIdleExpiresAt(idle) メソッドは、リフレッシュトークンのアイドルタイムアウトを設定します。交換が成功するたびにこのメソッドを呼び出さない場合、アイドルタイムアウトはアプリケーションのリフレッシュトークン有効期間設定を使用して上書きされます。
-
2023-09-21 以降 (US-3 リージョンのテナントでは 2024-02-22 以降) に発行されたリフレッシュトークンには、適切な値を持つセッション ID (
session_id) プロパティが含まれます。これより前に発行されたリフレッシュトークンでは、このプロパティの値は null です。
-
post-login API メソッド
api.refreshToken.revoke(reason) のリリース前に発行されたリフレッシュトークンには、event.refresh_token.device の情報は含まれません。
-
有効期限のないリフレッシュトークン、またはまだ交換されていないリフレッシュトークンには、
event.refresh_token.last_exchanged_at プロパティは含まれません。
-
セキュリティ上の理由から、非アクティブタイムアウトと絶対タイムアウトは、リフレッシュトークンの有効期限 で定義されたアプリケーションのリフレッシュトークン設定を超えて設定することはできません。有効期限設定を超える日付を設定しようとすると、API メソッドは リフレッシュトークンの有効期限 で定義された値まで更新し、テナントログに警告イベント (
w) を記録します。
-
api.refreshToken.setExpiresAt() と api.refreshToken.setIdleExpiresAt() はどちらも、現在の値からそれぞれの有効期間を短くすることしかできません。有効期間を延長または増加させることはできません。
Actions を使用すると、リスク検知を設定し、api.refreshToken.revoke(reason) メソッドとイベントオブジェクトを使用してリフレッシュトークンを無効化できます。
ImpossibleTravel によるリフレッシュトークンの無効化
のassessmentsオブジェクトを使用すると、ユーザーが ImpossibleTravel を示す場所からログインしているかどうかを判定し、そのトランザクションに関連付けられている現在のリフレッシュトークンを無効化できます。
exports.onExecutePostLogin = async (event, api) => {
const { riskAssessment } = event.authentication ?? {};
const ImpossibleTravel = riskAssessment?.assessments.ImpossibleTravel;
// 不可能な移動であり、かつリフレッシュトークンの交換である場合
if (ImpossibleTravel?.code === "impossible_travel_from_last_login") {
if (event.refresh_token) {
api.refreshToken.revoke("Refresh token revoked due to impossible travel");
}
}
};
この例では、Action の冒頭で event.authentication.ImpossibleTravel.code が impossible_travel_from_last_login property と一致するかどうかを確認します。true の場合、Action は api.refreshToken.revoke() を呼び出して、次を実行します。
- トランザクションを拒否する
- リフレッシュトークンを無効化する
- 403 の
access_denied エラー応答を返す
- 「不可能移動のためリフレッシュトークンが無効化されました」というエラーを返す
IP バインディングによるリフレッシュトークンの無効化
post-login オブジェクトのプロパティ event.refresh_token.device.initial_ip と event.request.ip を使用して、リフレッシュトークンのトランザクションが有効期間を通じて同じ IP アドレスに紐付いたままであることを保証する場合。このシナリオでは、IP アドレスの変更はすべてリスクと見なされ、新しいリフレッシュトークンが必要になります。
exports.onExecutePostLogin = async (event, api) => {
const refreshTokenInitialIp = event.refresh_token?.device?.initial_ip;
const requestCurrentIp = event.request.ip;
// リフレッシュトークンが存在し、IPアドレスが変更された場合
if (
refreshTokenInitialIp &&
requestCurrentIp &&
refreshTokenInitialIp != requestCurrentIp
) {
api.refreshToken.revoke("Invalid IP change");
}
};
この例では、event.refresh_token.device.initial_ip プロパティと event.request.ip プロパティを使用して IP アドレスを追跡するために、Action の冒頭でチェックを行います。Action は、トランザクションの IP アドレスが変更されたかどうかを判定します。true の場合、Action は api.refreshToken.revoke() を呼び出して次を実行します。
- トランザクションを拒否する
- リフレッシュトークンを無効化する
403 レスポンスの access_denied エラーを返す
- 「
Invalid IP change」エラーを返す
また、より制限の緩い Action として、IP の変化ではなく ASN の変化を監視するために、event.request.asn プロパティと event.refresh_token.device.initial_asn プロパティを追跡することもできます。
ユースケース: リフレッシュトークンの有効期限のカスタマイズ
Actions を使用すると、リフレッシュトークンの有効期間やアイドル期限をカスタマイズできます。具体的には、post-login の api.refreshToken.setExpiresAt(absolute) メソッドと api.refreshToken.setIdleExpiresAt(idle) メソッドを使用して、特定のトランザクションにおけるリフレッシュトークンの絶対有効期限とアイドル有効期限を設定できます。
組織に基づいてリフレッシュトークンの絶対有効期限をカスタマイズする
Post Login Action を使用すると、組織ごとにリフレッシュトークンの有効期間を設定できます。以下の例では、組織の refresh_token_timeout メタデータを使用して、リフレッシュトークンの有効期限を設定します。
exports.onExecutePostLogin = async (event, api) => {
// 組織に設定されたリフレッシュトークンのタイムアウト(ミリ秒単位)メタデータ
const organization_refresh_token_lifetime =
event.organization?.metadata?.refresh_token_timeout;
if (organization_refresh_token_lifetime) {
// リフレッシュトークンが既に存在する場合
if (event.refresh_token) {
const created = Date.parse(event.refresh_token.created_at);
const new_expiration_time =
created + Number(organization_refresh_token_lifetime);
api.refreshToken.setExpiresAt(new_expiration_time);
} else {
// リフレッシュトークンがまだ存在しない場合(例:トークンの発行中)
const current_time = new Date().getTime();
const new_expiration_time =
current_time + Number(organization_refresh_token_lifetime);
api.refreshToken.setExpiresAt(new_expiration_time);
}
}
};
この例では、組織に対して特定の絶対タイムアウトが定義されている場合、Action はリフレッシュトークンの絶対タイムアウトを次のように設定します。
- 新規発行されたトークン:
current_time + organization_refresh_token_lifetime
- 既存のトークン:
event.refresh_token.created_at + organization_refresh_token_lifetime
メンバーシップロールに基づいてリフレッシュトークンの非アクティブタイムアウトをカスタマイズする
application と ユーザーメタデータ を使用すると、Post Login Action でリフレッシュトークンのアイドルタイムアウトを設定できます。次の例では、ユーザーのメンバーシップロールの判定にユーザーメタデータの roles を使用し、期待されるリフレッシュトークンのアイドルタイムアウトの定義に Application metadata を使用します。
exports.onExecutePostLogin = async (event, api) => {
// 管理者はアプリケーションメタデータで、リフレッシュトークンのアイドルタイムアウトが短く設定されています
const max_idle_lifetime =
event.client.metadata?.admin_refresh_token_idle_timeout;
// ユーザーのアプリメタデータのroles属性を確認し、管理者ユーザーかどうかを判定します。
const isAdmin = event.user?.app_metadata?.roles?.find(
(role) => role === "admin",
);
// アプリケーションに特定のアイドルタイムアウトが定義されている場合、タイムアウトを設定します
if (max_idle_lifetime && isAdmin) {
const current_time = new Date().getTime();
api.refreshToken.setIdleExpiresAt(current_time + Number(max_idle_lifetime));
}
};
この例では、Application に特定のアイドルタイムアウトが定義されていて、かつユーザーが Admin の場合、Action はリフレッシュトークンの非アクティブタイムアウトを current_time に refresh_token_idle_timeout を加えた値に設定します。ここでのポイントは、新しく発行されるトークンと、リフレッシュトークン交換時の既存のトークンの両方についてタイムアウトを変更していることです。