Amazon CognitoとGoogle CloudのOAuth 2.0 クライアントを連携させて、Google認証を実装してみた
こんにちは、ゲームソリューション部のsoraです。
今回は、Amazon CognitoとGoogle CloudのOAuth 2.0 クライアントを連携させて、Google認証を実装してみたことについて書いていきます。
構成
今回構築したのは以下の構成です。
Flutterで作ったテストアプリからAmazon CognitoとGoogle CloudのOAuth 2.0 クライアントでGoogle認証をして、Lambdaにアクセスする構成です。

テストアプリ側では、Googleで認証ボタンを押すと、Googleのログイン画面に遷移してログインを行います。
Googleログイン後に認証テスト実行ボタンを押すと、API GatewayでJWT Authorizerが動いて、その後にLambdaへアクセスします。




Google CloudでのOAuth 2.0 クライアントの作成
Google Cloudのコンソールで、Google Auth Platformのクライアントを選択します。

クライアントを作成ボタンを押して、クライアントIDを作成します。
- アプリケーションの種類:ウェブアプリケーション
- 承認済みのリダイレクトURIには以下を入力
https://{Amazon Cognitoユーザープールのドメイン}.auth.{aws region}.amazoncognito.com/oauth2/idpresponse

作成ボタンを押すと、クライアントIDとクライアントシークレットが表示されるためメモしておきます
AWS構築
AWSはTerraformで構築します。
以下Cognito部分のみを抜粋してコメントで説明しています。
## ユーザープールの作成
resource "aws_cognito_user_pool" "main" {
name = "${var.project}-${var.env}-user-pool"
auto_verified_attributes = ["email"]
## ユーザー属性の定義
schema {
name = "email"
attribute_data_type = "String"
required = true
mutable = true
}
}
## ユーザープールのドメイン設定
resource "aws_cognito_user_pool_domain" "main" {
domain = "${var.project}-${var.env}-${var.cognito_domain_suffix}"
user_pool_id = aws_cognito_user_pool.main.id
}
## ユーザープールのクライアント作成
resource "aws_cognito_user_pool_client" "app" {
name = "${var.project}-${var.env}-app-client"
user_pool_id = aws_cognito_user_pool.main.id
allowed_oauth_flows_user_pool_client = true
allowed_oauth_flows = ["code"]
## 取得できる情報のスコープを設定
allowed_oauth_scopes = ["openid", "email", "profile"]
## コールバックURLには、{アプリのスキーム}://oauth/callbackを入力
callback_urls = var.callback_urls
## ログアウトURLには、{アプリのスキーム}://oauth/logoutを入力
logout_urls = var.logout_urls
## Google IdPが作成されている場合のみ追加
## Cognitoの標準認証も併用したい場合は、["COGNITO", "Google"]
supported_identity_providers = ["Google"]
explicit_auth_flows = [
"ALLOW_REFRESH_TOKEN_AUTH",
"ALLOW_USER_SRP_AUTH"
]
generate_secret = false
}
## Google IdP設定
resource "aws_cognito_identity_provider" "google" {
user_pool_id = aws_cognito_user_pool.main.id
provider_name = "Google"
## プロバイダーの種類
provider_type = "Google"
provider_details = {
## Googleから取得する情報の範囲
authorize_scopes = "openid email profile"
## Google CloudのOAuth 2.0 クライアントIDとクライアントシークレット
client_id = var.google_client_id
client_secret = var.google_client_secret
}
attribute_mapping = {
email = "email"
username = "sub"
}
}
動作確認
Flutterアプリを起動して、Googleでログインボタンを押すと、Googleのログイン画面に遷移しました。


Googleのログインを行った後、Google認証済みとなっています。

その後に、認証テスト実行ボタンを押すと、成功のメッセージが表示されました。

Amazon Cognitoを見てみると、Googleログインしたユーザーが追加されていることがわかります。

グループについても、Google用のグループが作成されて、先ほどのユーザーが追加されていることがわかります。

最後に
今回は、Amazon CognitoとGoogle CloudのOAuth 2.0 クライアントを連携させて、Google認証を実装してみたことを記事にしました。
どなたかの参考になると幸いです。









