prompt=login の仕組みは、ユーザーエージェント (ブラウザー) を通過する際にパラメーターを削除するだけで回避できてしまうため、 プロバイダー (OP) に対する UX 上のヒントとしてしか使えません。たとえば、 (RP) が次のようなリンクを表示したい場合です。
「こんにちは、Josh さん。あなたではありませんか? ここをクリックしてください。」
ただし、新たな認証が実際に行われたことを検証する目的で、これに頼るべきではありません。これに対処するには、クライアントが auth_time クレーム を使用して再認証が行われたことを検証する必要があります。この クレーム は、認証リクエストで prompt=login または max_age=0 パラメーターを指定すると、 に自動的に含まれます。
Authorization API の /authorize エンドポイント に max_age パラメーターを渡す必要があります。Auth0.js または Lock を使用している場合は、ライブラリーの適切なオプションでこのパラメーターを設定できます。
再認証をどのように実装するかは、具体的なユースケースによって異なります。機微な操作のための単純な再認証と、機微な操作のための step-up (つまり ) は区別してください。どちらも有効なセキュリティ対策です。前者ではエンドユーザーにパスワードの再入力を求め、後者ではそれに加えて、事前に設定された多要素認証の手段の利用も求めます。
prompt=login パラメータの制約
prompt=login パラメータが定義されています。
prompt任意: 認可サーバーがエンドユーザーに再認証と同意を求めるかどうかを指定する、スペース区切りの大文字と小文字を区別する ASCII 文字列値のリストです。定義されている値は次のとおりです。login認可サーバーは、エンドユーザーに再認証を求める必要があります。エンドユーザーを再認証できない場合は、通常
login_required エラーを返さなければなりません。JSON
prompt=login パラメーターを削除するだけでよく、ID トークンに含まれるフィールドだけでは RP はその違いを見分けられません。
以下は、prompt=login パラメーターを使用した簡略化された implicit フローの図です。

prompt=login パラメーターを削除することだけで、再認証の手順はスキップできます。

prompt=login によって実際に再認証が行われたと信頼することはできません。
max_age 認証リクエストパラメーター
prompt=login とは異なり、max_age 認証リクエストパラメーターは、指定した時間内に再認証が行われたことを RP が確実に確認できる仕組みを提供します。OIDC 仕様 には次のように記載されています。
max_age任意: 認証からの最大経過時間。エンドユーザーが最後に OP によって能動的に認証されてから、何秒まで許容するかを指定します。経過時間がこの値を超える場合、OP はエンドユーザーに対して能動的な再認証を試みなければなりません。 (
max_age リクエストパラメーターは、OpenID 2.0 PAPE の max_auth_age リクエストパラメーターに対応します。) max_age を使用する場合、返される ID トークンには auth_time クレーム値が含まれていなければなりません。max_age を要求した場合、RP が受け取る ID トークンには auth_time クレームが含まれていなければなりません。つまり、max_age は次の 2 つの方法のいずれかで使用できます。
- セッションの鮮度に最低要件を設けるため: アプリで、ユーザーに 1 日 1 回の再認証を求める要件がある場合、値を指定した
max_ageを渡すことで、より長時間の セッション内でもこれを強制できます。値は秒単位で定義します。 - 即時に再認証を強制するため: アプリで、アクセス前にユーザーの再認証が必要な場合は、
max_ageパラメーターに 0 を指定すると、AS が新たなログインを強制します。

auth_time クレームを参照して、要求した max_age パラメーターが満たされたかどうかを判断できます。このように、max_age=0 パラメーターは、prompt=login パラメーターを無効化しうるのと同種のクライアント改ざんの影響を受けません。
auth_time クレームを使用する
max_age パラメーターを使えば再認証が行われたことを確実に確認できますが、prompt=login にはその仕組みがありません。つまり、再認証を強制したい場合、あまり安全な選択肢があるとは言えません。
- prompt=login:
promptパラメーターだけを含め、AS が実際に再認証を行ったかどうかは検証しません。 - prompt=login & max_age=999999: 任意の
max_ageを指定してauth_timeクレームが含まれるようにします。再認証が行われたことは検証できますが、パラメーターが煩雑になります。 - max_age=0:
max_ageパラメーターだけを使って、実質的にログインプロンプトを強制します。なお、最近の仕様更新でこのパラメーターの意味がさらに明確化され、実質的にprompt=loginと同じであることが示されました。これは、UX のためのパラメーターとセッション維持のためのパラメーターを混同してしまうため、現実的ではありません。
prompt=login リクエストパラメーターに応答する際、ID トークンに auth_time クレームを含めて返すことを選びました。つまり、prompt=login を使いつつ、再認証が行われたことも検証できます。
auth_time の検証例
再認証が実際に行われたことを確認するため、必ず検証を実装してください。適切な
auth_time が返されていることを検証する必要があります。Auth0OidcStrategy に max_age=0 オプションを追加することです。
JavaScript
max_age パラメータの検証が行われるため、追加の検証手順は不要であることに注意してください。
JavaScript
prompt=login を使用することもできますが、標準では ID トークンのレスポンスに auth_time を含めることが必須ではないため、検証は手動で行う必要があります。したがって、ストラテジーのコンストラクターは次のようになります。
JavaScript
max_age=0 とは異なり、クライアント側で auth_time パラメータを手動で検証する必要があります。詳しくは、auth_time クレームを使用するをご覧ください。
既知の問題
auth_time は更新されます。
上流のアイデンティティプロバイダーで再認証を強制する機能は、すべてのプロバイダーがこれをサポートしているわけではないため、Auth0 ではサポートしていません。
以下の図は、フェデレーション接続で再認証を選択したユーザーのフロー例を示しています。

prompt=loginまたはprompt=consentは、一般に外部の (ソーシャル) アイデンティティプロバイダーにユーザーの再認証を促す手段ですが、Auth0 がこれを強制することはできません。