CloudFront の代替ドメイン名では Cognito のマネージドログインが機能しない
Cognito マネージドログインの cookie が原因でした。
背景
Amazon Cognito のクォータ - Amazon Cognito
リソース クォータ 調整可能 最大クォータ アカウントあたりのカスタムドメイン数 4 いいえ 該当なし
Cognito にはアカウントあたりのカスタムドメイン数が 4 というハードリミットがあります。
ハードリミットであるため上限緩和はできない項目です。
代替案として、CloudFront の代替ドメイン経由で Cognito のマネージドログインにアクセスする方法を検討しました。
しかし、CloudFront では Cognito マネージドログインの cookie を扱うことができないため、マネージドログインからのサインアップやサインインができませんでした。
検証内容
以下の設定でリソースを作成しました。
- Cognito ユーザープール
- サインイン識別子のオプション: メールアドレス
- CloudFront ディストリビューション
- 代替ドメイン: auth.my-domain.com
- オリジン: Cognito ユーザープールのデフォルトドメイン
- キャッシュポリシー: ヘッダーなし、cookie すべて、クエリ文字列すべて
- Route 53 にエイリアスレコードを追加
- Cognito ユーザープールのアプリケーションクライアント
- 許可されているコールバック URL: https://auth.my-domain.com/
上記設定後、以下の URL にアクセスすることで CloudFront の代替ドメインで Cognito のマネージドログインの画面を表示することはできました。
https://auth.my-domain.com/login?client_id=<アプリケーションクライアントの ID>&response_type=code&scope=email+openid+phone&redirect_uri=https%3A%2F%2Fauth.my-domain.com
しかし、サインアップを試みたところで以下のエラーが発生しました。
Invalid input: Invalid challenge transition

発生した問題
サインアップのボタンをクリックした段階で、HAR ファイルには 400 エラーが記録されていました。
また、CloudTrail にも signup_POST で 400 エラーが記録されていました。
HAR ファイルのリクエストを確認したところ、set-cookie に以下のような値が設定されていました。
cognito="xxx"; Max-Age=3600; Domain=ap-northeast-1jeyo8qwvm.auth.ap-northeast-1.amazoncognito.com; Path=/; HttpOnly; Secure; SameSite=Lax
CloudFront の代替ドメインからのアクセスの場合でも、set-cookie には Cognito のデフォルトのドメインが指定されていました。
Cognito のデフォルトドメインからのサインアップの場合は上記ドメインが一致しますが、CloudFront の代替ドメイン経由の場合にはドメインが一致しません。
そのため、CloudFront からのサインアップ時にはリクエストに上記の Cognito の cookie が含まれずエラーになっていました。
回避策
念のため AWS サポートにも確認しましたが、アカウントあたりのカスタムドメイン数はハードリミットであるため、複数のアカウントを使用することが回避策である旨の回答を頂きました。
まとめ
今回は CloudFront の代替ドメイン名では Cognito のマネージドログインが機能しないという内容を紹介しました。
どなたかの参考になれば幸いです。
Discussion