[アップデート] Amazon Cognito がOIDCプロンプトパラメータのサポートを開始したので調査してみた
はじめに
2025年5月16日 Amazon Cognitoのマネージドログイン(Plusティア、Essentialsティア)上でOpenID Connectのプロンプトパラメータがサポートされるようになりました。このアップデートによって認証時の再認証要求や既存セッション利用など柔軟にサインイン時の挙動を指定できるようになりました。
以下公式ドキュメントにて「2025/06/10」現在は言語をEnglishにしないとpromptパラメータの説明は出て来ないので注意
今回はこれらパラメータの挙動をGoogleログインを用いて検証してみたいと思います。
Amazon Cognito + Googleログインの設定方法も記載していますが、プロンプトパラメータの検証のみ確認したい方は「プロンプトパラメータの挙動確認」セクションまで飛ばしてください。
Google Cloud プロジェクト設定
まずはじめに、OAuthの設定をするためにGoogle Cloud Projectの設定をします。適当にGoogle Cloud Console上でプロジェクトを作成した後、サイドバーから「APIとサービス」 > 「OAuth同意画面」を選択します。
以下の情報を入力し、「作成」を押下します。
- アプリ名: demo-cognito-oidc
- ユーザーサポートメール: お好きなメールアドレス
- 対象: 内部
- 連絡先: お好きなメールアドレス
※今回はGoogleプロジェクト管理組織(特定ドメイン)からしかGoogleログインさせないため対象を「内部」に選択していますが、外部公開のサービスにて使用する場合は「外部」を選択してください。
続いてサイドバーから「クライアント」 > 「クライアントを作成」を選択します。
以下の情報を入力し「作成」を押下すと、クライアントID,クライアントシークレットが作成され、表示されますので保存します。
- アプリケーションの種類: ウェブアプリケーション
- 名前: demo-cognito-oidc-web
※「承認済みのJavaScript生成元」&「承認済みのリダイレクトURI」は後ほど登録
クライアントが作成できると、サイドバーのブランディングから「ドメインの追加」を選択し、承認するドメインに「amazoncognito.com」を追加して保存します。
次にサイドバー「データアクセス」 > 「スコープを追加または削除」を選択し、OIDCに必要な以下のスコープを追加して保存します。
- userinfo.email
- userinfo.profile
- openid
Amazon Cognito設定
マネジメントコンソールからAmazon Congnito画面へ行き、「ユーザープール」 > 「ユーザープールを作成」を選択します。
設定値を以下にして「ユーザディレクトリを作成する」を押下す。
- アプリケーションタイプ: 従来のウェブアプリケーション
- アプリケーション名: demo-cognito-oidc-user-pool
- サインイン識別子のオプション: メールアドレス
- リターンURL: https://classmethod.jp/ (サインイン成功時弊社ホームページにリターンするように設定)
その後Googleログイン設定を行うため、作成したユーザープールを選択し、「ソーシャルプロパイダーでのログインを追加」 > 「プロバイダーを管理」を選択します。
「アイデンティティプロバイダーを追加」を選択します。
以下の設定を行い追加します。
- フェデレーティッドサインインのオプション: Google
- クライアントID: Google Cloud 作成したOIDCクライアントID
- クライアントシークレット: Google Cloud 作成したOIDCクライアントシークレット
- 許可されたスコープ: Google Cloudで設定したスコープと合わせる
アイデンティティプロバイダーを追加したら、サイドバー横のブランディング項目から「ドメイン」を選択し、マネージドログイン用のドメインをコピーします。
Google Cloud Consoleに戻り、OAuthクライアント画面にて先ほど空欄で設定したドメインに先ほどコピーしたCognitoドメインを貼り付けます。
- 承認済みのJavaScript 生成元: コピーしたドメイン
- 承認済みのリダイレクトURI: コピーしたドメイン + /oauth2/idpresponse
最後にCognito マネジメントコンソール画面に戻り、「アプリケーションクライアント」 > 「ログインページ」 > 「編集」を選択し、以下を確認し、変更を行うとCognitoにてGoogleログインが行える準備が完了します。
- 許可されているコールバックURL: 先ほど設定したサインイン成功時にコールバックされるURL(今回はクラメソのホームページ)
- IDプロバイダー: Googleに変更
- OAuth2.0許可タイプ: 認証コード付与
プロンプトパラメータの挙動確認
ここまででCognitoのマネージドログインを使用してGoogleログイン
が可能になったので実際に今回アップデートされたpromptパラメータを検証していきます。
まずはpromptパラメータを付与せず通常のログイン画面からGoogleログインを行います。
「Sign in with Google」ボタンを押すと以下のGoogle認証画面に飛ばされるので認証します。
認証が成功すると、コールバック先に設定したクラスメソッド公式ホームページが表示され、サインインが成功したことがわかります。
Cognitoのユーザープール画面にて「ユーザ」を確認すると、きちんと外部プロバイダー経由でユーザーが作成されています。
prompt = none の場合
公式ドキュメント抜粋 説明文
Amazon Cognito は、有効な認証済みセッションを持つユーザーに対して、サイレントモードで認証を続行します。このプロンプトにより、ユーザーはユーザープール内の異なるアプリクライアント間でサイレントモードで認証できます。ユーザーがまだ認証されていない場合、認可サーバーはlogin_required エラーを返します。
一度Google 認証を通しセッションが残っている状態で 「prompt = none」 クエリパラメータをつけてログイン画面にて「Sighin with Google」を押します。
セッションが残っているので再度認証を通らずにサイレントモードで認証され、クラスメソッド公式ページが表示されました。
セッションがない場合は未認証時と同じ動作になりました。
prompt = login の場合
公式ドキュメント抜粋 説明文
Amazon Cognito では、既存のセッションがある場合でも、ユーザーに再認証を求めます。ユーザーの ID を再度確認する必要がある場合は、この値を送信してください。既存のセッションを持つ認証済みユーザーは、そのセッションを無効にすることなくサインインを再開できます。既存のセッションを持つユーザーが再度サインインすると、Amazon Cognito によって新しいセッション Cookie が割り当てられます。このパラメータは IdP に転送することもできます。このパラメータを受け入れる IdP は、ユーザーに新たな認証試行を要求します。
一度Google 認証を通しセッションが残っている状態で 「prompt=login」 クエリパラメータをつけてログイン画面にて「Sighin with Google」を押します。
セッションは残っていますが、このように必ず再認証が求められるようになりました。
prompt = select_account の場合
公式ドキュメント抜粋 説明文
この値はローカルサインインには影響しません。IdPにリダイレクトするリクエストで送信する必要があります。認可リクエストに含めると、このパラメータはprompt=select_account IdPのリダイレクト先のURLパスに追加されます。IdPがこのパラメータをサポートしている場合、ユーザーはログインに使用するアカウントを選択するよう求められます。
こちらはIdP(Google)が対応している場合にIdPへの認可リクエスト時に「prompt=select_account」パラメータを付与してくれるという説明です。ちなみにGoogleログインの場合は以下ドキュメントで対応していることがわかります。
prompt 省略可
ユーザーに表示するプロンプトのリスト(スペース区切り、大文字と小文字を区別)。このパラメータを指定しない場合、ユーザーにプロンプトが表示されるのは、プロジェクトがアクセス権をリクエストした初回のみです。詳しくは、 再同意を求めるメッセージをご覧ください。
次の値があります。
none 認証画面や同意画面は表示しないでください。他の値で指定しないでください。
consent ユーザーに同意を求めるメッセージを表示します。
select_account アカウントを選択するようユーザーに求める。
と記載があるので必ずアカウントを選択するようにユーザーに求める挙動になるはずです。
一度Google 認証を通しセッションが残っている状態で 「prompt=select_account」 クエリパラメータをつけてログイン画面にて「Sighin with Google」を押します。
Googleログインの場合は「prompt=login」と全く同じ挙動で、セッションは残っていますが必ずGoogleの再認証が求められました。「prompt=login」は必ず再認証、「prompt=select_account」の場合、あくまで挙動はサードパーティのIdPの仕様に任せるということなのでしょうか。特に違いが見えませんでした。
prompt = consent の場合
公式ドキュメント抜粋 説明文
この値はローカルサインインには影響しません。IdP にリダイレクトするリクエストで送信する必要があります。認可リクエストに含めると、このパラメータがprompt=consentIdP のリダイレクト先の URL パスに追加されます。IdP がこのパラメータをサポートしている場合、ユーザープールにリダイレクトする前にユーザーの同意を求めます。
こちらの挙動はわかりやすく、IdP(Google)が対応している場合にIdPへの認可リクエスト時に必ずユーザー同意画面が表示されました。
また、今回画面は載せていないですがスペース区切りの複数値設定も可能で、例えば「prompt=login consent」とすれば必ず再認証を求められ、かつ同意画面も表示されました。
最後に
今回のアップデートで Amazon Cognito が OIDC プロンプトパラメータに対応したことで、認証フローをもっと細かく制御できるようになりました。
具体的には、prompt=login を使えば、機密情報を見る前や金額操作をする前に、もう一度ログインを求めることができます。逆に prompt=none を使えば、SPAなどのウェブアプリで、画面遷移のたびにログイン画面が出てくるストレスを減らせます。
Google連携している場合は、select_account パラメータでアカウント選択画面を出したり、consent パラメータで同意画面を表示したりすることも可能になりました。
これらの機能サポートによってユーザー体験を損なわずにセキュリティを高められるので、ぜひCognitoのマネージドログインを使っている方は試してみてください。今回は以上です。