こんにちは、マネージドサービス部テクニカルサポート課の坂口です。
先日、お客様からのお問い合わせ対応のため、Application Load Balancer(以下、ALB) + Amazon Cognito(以下、Cognito) のユーザ認証に関して検証したところ、いくつかハマったので対処方法を記載します。
- はじめに
- ALB リスナールールで認証設定時に「The user pool client must have a client secret」
- ALB にアクセス後「An error was encountered with the requested page. 」
- 認証成功後「401 Authorization Required」
- まとめ
はじめに
解決後に下記弊社記事の存在を知りました。
環境構築の際はこちらを参考にしてください。
blog.serverworks.co.jp
ALB リスナールールで認証設定時に「The user pool client must have a client secret」
エラー内容の通り、アプリケーションクライアントでクライアントシークレットを生成していないのが原因でした。
クライアントシークレットの生成はアプリケーションクライアント作成時のみ生成可能となっているので、アプリケーションクライアントの再作成で解決しました。
ALB にアクセス後「An error was encountered with the requested page. 」
アプリケーションクライアントのコールバック URL が正しく設定されていないのが原因でした。
コールバック URL を正しい設定に修正することで解決しました。
- エラー発生時の設定
https://[ALB の DNS 名]/[パスパラメータ]/oauth2/idpresponse
- 正しい設定
https://[ALB の DNS 名]/oauth2/idpresponse
IdP アプリで次のリダイレクト URL のいずれかを許可します。ユーザーが使用するものであればどれでも構いません。ここで DNS はロードバランサーのドメイン名であり、CNAME はアプリケーションの DNS エイリアスです。
認証成功後「401 Authorization Required」
Cognito にて認証成功後、ALB から 401 Authorization Required が返ってきました。
ブラウザキャッシュ後、再度アクセスしましたが事象再現せず。 原因は設定不備ではなく、単にログインプロセスでタイムアウトしていただけでした。
例えば、ユーザーが Application Load Balancer を使用してログインページをロードする場合、15 分以内にログインプロセスを完了する必要があります。15 分間のタイムアウトの期限れ後にユーザーが待機してログインしようとすると、ロードバランサーが HTTP 401 エラーを返します。ユーザーはページを更新して、もう一度ログインする必要があります。
また、ALB のアクセスログを確認すると、ALB から「401」が返されていて、エラー理由コードは「AuthInvalidStateParam」となっていました。
まとめ
エラーの原因は設定不備が多く、「ドキュメントを読む」ことの大切さを感じました。
同じ事象が発生した際に参考になれば幸いです。