GatewayのエンドポイントにアクセスしたときにCognitoのTokenで認証し、失敗したらログイン画面を表示させる。これだとHeaderにTokenを付けてアクセスする必要があり認証に失敗するとUnauthorizedが返る。GatewayではなくALBをLambdaの前段に挟めば今回やることが簡単に実現できる。sambaiz-net準備UserPoolとClientを作成する。CloudFormationで作成する場合SchemaのMutableのデフォルトがfalseなのに注意。変えると作り直される。true今回はフェデレーションでGoogleアカウントでログインできるようにする。Poolのフェデレーティッドアイデンティティとは異なる。Mapping、Clientの設定はCloudFormationでできないので手でやる。Mappingで変えられるがusernameは変更不可な値なのでsubのままにしておく。リダイレクトされることを確認する。grantにチェックが入っているか確認する。sambaiz-netCookieで渡ってきたTokenを検証し、失敗した場合はログイン画面にリダイレクトさせる。identity_providerを指定するかClientに一つしか紐づいていなければそのプロバイダのログイン画面に飛び、そうでなければ選択する画面が表示される。ログインしてクエリパラメータとして渡ってきたcodeとstateもこの関数で受け取り、検証してTokenを発行し一旦返してCookieに焼く。sambaiz-net通常stateはサーバーに保持されるがDBを持たなくていいようにCookieに焼いている。CSRF対策のためのものなのでCookieが攻撃者に読み書きされなければ意味を為すと思っているが、このフローで問題がある場合は教えてほしい。State、Token共にCookieに焼いているためCORSのAccess-Control-Allow-Originを*などにしてしまうと穴が開く。