prompt=login
の仕組みは、ユーザーのエージェント(ブラウザー)から渡されるパラメーターを取り除くだけで動作不能にできます。これは証明書利用者(RP)が以下のようなものを表示したい場合に、UXヒントをプロバイダー(OP)に提供するためだけに使用されるべきです:
「Joshさん、こんにちは。お客様ではありませんか?こちらをクリックしてください。」
ただし、これは新たに行われた認証の確認に利用するべきではありません。それを避けるために、再認証を理由にmax_age
が要求された場合には、クライアントはauth_time
クレームを使用して、再認証が行われたことを確認する必要があります。このクレームは、認証要求でprompt-login
またはmax_age=0
が渡されると、自動的にIDトークンに含められます。
max_age
パラメーターをAuthorization APIの/authorize
エンドポイントに渡す必要があります。Auth0.jsまたはLockを使用している場合には、ライブラリーの適切なオプションでパラメーターを設定することができます。
再認証の実装方法は特定のユースケースに依存します。機密性の高い操作に対して、再認証とステップアップ(多要素認証)は区別しなければなりません。それらは両方とも有効なセキュリティ対策です。前者ではエンドユーザーにパスワードの再入力を要求するの対し、後者ではあらかじめ構成済みの多要素認証も併せて要求します。
prompt=loginパラメーターの制限事項
OIDCの仕様では、再認証UI(通常はログインプロンプト)をトリガーするのにprompt=login
パラメーターが使用できると定義されています。
prompt任意:スペースで区切った、大文字・小文字の区別があるASCII文字列値のリストで、認証サーバーがエンドユーザーに対して再認証と同意を要求するかどうかを指定します。定義された値は:login認可サーバーがエンドユーザーに対して再認証を要求します。エンドユーザーを再認証できなかった場合はエラー(通常は
login_required
)を返さなければなりません。JSON
prompt=login
パラメーターを削除するだけで済むため、IDトークンに含まれるフィールドではRPがその違いを判別できません。
下の図は、prompt=login
パラメーターを用いた暗黙フローを簡単に説明したものです。

prompt=login
パラメーターを削除するたけで、再認証がスキップできることに注意してください。

prompt=login
が実際に再認証を生じさせたと信頼することはできません。
max_age認証要求パラメーター
prompt=login
と違って、max_age
認証要求パラメーターには、指定の間隔内に再認証が行われたことをRPが確実に確認できる方法があります。OIDCの仕様には以下が定義されています。
max_age任意:最大認証時間。OpenIDプロバイダーが最後に有効なエンドユーザー認証を行ってからの、許可される経過時間を秒単位で指定します。経過時間がこの値より大きい場合、OpenIDプロバイダーは、エンドユーザーを有効に再認証しようとしなければなりません(
max_age
要求パラメーターは、OpenID 2.0 PAPEのmax_auth_age
要求パラメーターに対応します)。 max_age
が使用された場合、返されるIDトークンにはauth_time
クレーム値が含まれなければなりません。max_age
を要求した場合、RPにauth_time
クレームを渡す必要があります。つまり、max_age
の用途には以下の2つがあります。
- セッションのフレッシュネスを指定する :アプリがユーザーに1日1回の再認証を要求する場合には、
max_age
に値を指定すると、セッションの有効期間を長くすることができます。これは秒単位で定義します。 - 即座の再認証を強制する :アプリがユーザーにアクセス前の再認証を要求する場合には、
max_age
パラメーターの値を0に設定すると、ASが新たにログインを強制します。

auth_time
クレームを確認し、max_age
パラメーターでの要求が満たされたかを判断できます。こうすることで、max_age=0
パラメーターには、prompt=login
パラメーターの動作を妨げるのと同じようなクライアントの改ざんが通用しなくなります。
適切な
auth_time
を含むIDトークンを受信していることを検証するのはRPのみであることに注意してください。この検証は、アプリケーション作成者と、max_age
パラメーターを使用しているフレームワークが行います。auth_timeクレームを使用する
OIDCの仕様により、再認証の実行を確実に確認する方法として、max_age
パラメーターは使用できても、prompt=login
が使用できないことを説明しました。これは、再認証を強制したい場合に安全なオプションを提供しません。
- imprompt=login :
prompt
のみを含み、ASが実際に再認証したことは確認しません。 - prompt=login & max_age=999999 :
auth_time
クレームが使用されるように、任意のmax_age
を含めます。再認証が行われたことは確認できますが、パラメーターが乱雑になります。 - max_age=0 :
max_age
パラメーターのみを使用して、ログインプロンプトを強制的に表示します。最近更新された仕様ではこのパラメーターをさらに明確化し、実質的にはprompt=login
と同等だとしています。これは、UXパラメーターであるべきものをセッション維持パラメーターと混合させるため、適切ではありません。
prompt=login
要求パラメーターへの応答で、IDトークンにauth_time
クレームを含めて送信するようにしています。つまり、prompt=login
を使用すると同時に、再認証が行われたことを確認することができます。
auth_time確認の例
再認証が行われたことを確認する検証を必ず実装してください。適切な
auth_time
が返されたことを検証しなければなりません。max_age=0
オプションをAuth0OidcStrategy
に追加して確認する方法です。
JavaScript
max_age
パラメーターの確認を処理しているため、確認の手順がこれ以上必要にならないことに注意してください。
JavaScript
prompt=login
を使うこともできますが、規格としてauth_time
はIDトークン応答の付随的な発生を要求しないため、手動で確認を処理しなければなりません。このストラテジーコンストラクターは以下のようになります。
JavaScript
max_age=0
とは違って、クライアントは手動でauth_time
パラメーターの確認を処理する必要があります。詳細については、「auth_timeクレームを使用する」をお読みください。
上の例は、簡略化された概念実証です(最後の10秒以内に認証されていなければなりません)。再認証が行われたことを検証したい場合は、理想的には、次のような作業が必要になります。
- 最初の認証要求が行われた時刻を記録する
- 認証応答時に、要求の送信時刻を取得する
- 最初の認証要求の時刻を
auth_time
クレームと比較して、auth_time
のタイムスタンプの方が後であることを確認する
既知の問題
Auth0が保証できるのは、アップストリームのIDプロバイダーと交換が行われることだけです。これは、ユーザーが実際にサードパーティーのIDプロバイダーにサインインしたり、ユーザーに既存のセッションがあるため再サインインの必要がなかったりすることによって行われます。いずれにしても、Auth0がアップストリームのIDプロバイダーと交換し、結果的にauth_time
が更新されます。
アップストリームのIDプロバイダーで再認証を強制することは、すべてのプロバイダーがこれに対応しているわけではないため、Auth0の対応外になります。
下の図は、フェデレーション接続で再認証するユーザーのフローの例を説明したものです。

prompt=login
またはprompt=consent
の使用は、一般的に外部の(ソーシャル)IDプロバイダーにユーザーの再認証を指示するもので、Auth0はそれを強制できません。
機密性の高い操作を防ぐため、クライアント側(ブラウザー)で行われるIDトークンまたは
auth_time
の検証には頼らないでください。