Cognito ユーザープール + ALB の認証にソーシャルサインイン(Google)を追加してみた

ALB + Cognito ユーザープール + ソーシャルサインイン(Google) という構成で、Cognito でも Google でも認証できる状態にしてみました。
2020.06.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ちゃだいん(@chazuke4649)です。

Amazon Cognito と Application Load Balancer を使用すると、AWSサービスだけで簡単に認証機能を実装できます。

過去に以下エントリにてこれらの構成は紹介されていました。

今回は、この構成にさらにソーシャルサインインを追加して、Cognitoユーザープールの認証でも ソーシャルサインインとしてのGoogle認証でも選べる状態を目指します。つまり、ALB + Cognito ユーザープール + ソーシャルサインイン(Google) という状態です。下図のような構成となります。

ALB + Cognito + Google

ちなみに、似ているようで違うパターンとして、「ALB + OIDC(Google)」の構成があります。詳細は以下エントリです。

こちらは、Cognito を経由せずに、直接 ALBの組み込み認証機能とOIDCとしてのGoogle認証を連携させる構成ですので、混同にご注意ください。

作業手順

作業手順の概要としては、以下の5つを順番に行っていきます。

  1. Amazon Cognito ユーザープールを作成する
  2. Amazon Cognito ユーザープールを設定する
  3. ALBとCognitoを組み合わせた認証を設定する
  4. ソーシャルサインインのGoogle認証を作成する
  5. Amazon Cognito ユーザープールにソーシャルサインインを追加する

1.2.3.については、先述の以下エントリにて紹介されていますので、今回は割愛し 4.5.からやってみたいと思います。

インフラエンジニアが一切コードを書かずにWebサーバーに認証機能を実装した話 | Developers.IO

ALB + Cognito認証で付与されるユーザー情報をEC2サイドから眺めてみる | Developers.IO

前提

よって、以下内容がすでに準備されている状態となります。

  • Nginx on EC2 を構築済み
  • ALBを構築済み
  • Route 53、ACMを設定し、https://www.chadain-test.comにて、ALB 経由で nginx の管理者画面が表示される状態

やってみた

基本的には、以下公式ドキュメントを参考に進めていきます。

ステップ 3.ユーザープールにソーシャルサインインを追加する (オプション) - Amazon Cognito

Amazon Cognito ユーザープールで Google をソーシャルアイデンティティプロバイダーとして設定する

4.ソーシャルサインインの(Google認証)を作成する

まずは、GCP にサインインします。

初めての場合は、開発者アカウントを作成し、新しいプロジェクトを作成します。

左側ナビゲーションから、「APIとサービス」の「OAuth同意画面」を開きます。

まず、OAuth同意画面ではユーザータイプを選びます。
社内ユーザーのみなどの場合は内部ですが、今回は一般ユーザーを想定しているので、外部を選びます。

次に詳細を入力していきます。アプリケーション名は任意なのでchadain-devと入力します。サポートメールにはすでにGoogleアカウントでサインインした際のメールアドレスが入力されています。

認証済みドメインの項目にamazoncognito.comを登録します。それ以外は特に何もせず、保存します。

次に、左側ナビゲーションから「認証情報」を選び、「認証情報を作成」で、「OAuth クライアント ID」を選択します。

  • アプリケーションの種類は「ウェブアプリケーション」を選びます
  • 名前はchadain-devにします
  • 承認済みの JavaScript生成元には、AWS側の Cognitoコンソールの「ドメイン」にて設定済みのAmazon Cognito ドメインを入力します。今回の場合、予めhttps://chadain-dev.auth.ap-northeast-1.amazoncognito.comと設定していたので、これを入力します
  • 承認済みのリダイレクト URIには、上記URIの末尾に/oauth2/idpresponseを足したものを入力します

OAuth2.0クライアントIDを作成すると、クライアントID と クライアントシークレットが発行されるので、これをメモしておきます。

Google側は以上で完了です。

5.Cognitoユーザープールにソーシャルサインインを追加する

次はAWS側で Cognitoコンソールを開きます。

使用するユーザープールの「IDプロバイダー」から「Google」を選び、先ほど発行されたクライアントID と クライアントシークレットを入力します。

承認スコープは記入例として表示されているprofile email openidとそのまま入力し、「Googleの有効化」を実行します。

次に「アプリクライアントの設定」を開き、既存設定を更新します。

「有効なIDプロバイダ」には「Google」が表示されるようになっているので、追加します。「許可されている OAuthフロー」では新たにImpplicit grantを追加します。「許可されている OAuthスコープ」では、少なくともemail openid profileを追加して、保存します。

Cognitoの既存設定の更新は以上です。

テスト

冒頭に記載の通り、本構成はすでに独自ドメインからCognito認証画面が開ける状態でした。
同じ独自ドメインから、今回の更新結果をみてみます。

URLをブラウザに入力すると、以下のような画面が表示されました。

変更前は、右側のCognito認証のみでしたが、左側にGoogle認証が追加されてますね!

左側の「Continue with Google」を選択します。

するとお馴染みの「アカウントの選択」が表示されたので、任意のGoogleアカウントを選択します。

そうすると無事、以下 Nginx の初期画面が表示されました!

ちなみに、Cognito認証の方からサインインし直しても成功したので、CognitoでもGoogleでもどちらでもサインインできる状態になりました。

終わりに

簡単にGoogle認証を追加することができました。この流れで他の認証パターンにも挑戦してみようと思います。

それではこの辺で。ちゃだいん(@chazuke4649)でした。