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 パラメーターを削除するだけで済み、RP は IDトークン に含まれるフィールドだけではその違いを判別できません。
以下は、prompt=login パラメーターを使用する簡略化された implicit flow の図です。

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 を要求した場合、返される 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 を含めることが必須ではないため、検証は手動で行う必要があります。したがって、strategy コンストラクターは次のようになります。
JavaScript
max_age=0 とは異なり、クライアントは auth_time パラメーターを自分で検証する必要があります。詳細については、auth_time クレームを使用するを参照してください。
既知の問題
auth_time が更新されます。
アップストリームの IDプロバイダーで再認証を強制することは、すべてのプロバイダーがこれをサポートしているわけではないため、Auth0 ではサポートされていません。
以下の図は、ユーザーがフェデレーション接続で再認証を選択した場合のフロー例を示しています。

prompt=login または prompt=consent は、一般に外部の (ソーシャル) IDプロバイダーにユーザーの再認証を求める方法ですが、Auth0 ではこれを強制できません。