はじめに
Amplify Gen 2のCognito認証にGoogleアカウントでのOAuthログインを追加してみました。
本記事ではGoogle認証の実装手順を紹介します。
最低限の実装で追加できますので、一度試してみてください。
Cognitoで使えるソーシャルログインプロバイダー
少しだけ全体像に触れておきます。
Cognitoでは、Google以外にもソーシャルログインに対応しています。対応方式は大きく2つあります。
-
ネイティブプロバイダー
Cognitoが直接サポート。AmplifyのAuthenticatorコンポーネントがログインボタンを自動表示してくれます。
| プロバイダー | 費用 | 備考 |
|---|---|---|
| 無料 | 本記事で実装。セットアップが最も手軽 | |
| Apple | $99/年 | Apple Developer Program必須。設定がやや複雑 |
| 無料 | Meta for Developersでアプリを作成 | |
| Amazon | 無料 | Login with Amazonを利用 |
-
カスタムOIDCプロバイダー
OIDC準拠のサービスをCognitoに接続。ログインボタンの自動表示はされないため、カスタムUIが必要。
| プロバイダー | 費用 | 備考 |
|---|---|---|
| LINE | 無料 | 国内ユーザー向けに有効。メール取得にはLINEへの申請が必要。LINE版の記事はこちら |
| X(旧Twitter) | 従量課金 | OIDC Discovery非対応。OIDCプロキシ(Lambda + API Gateway)の構築が必要 |
| GitHub | 無料 | OIDC非対応。OIDCプロキシの構築が必要 |
X と GitHub は OIDC Discovery をサポートしていないため、Cognito のカスタム OIDC プロバイダーとして直接統合できません。Lambda + API Gateway で OIDC プロキシを構築することで対応可能です。
今回は無料かつセットアップが最も手軽なGoogleを選びました。
実装してみよう
それでは、さっそく実装に入ります。
全体の流れ
Amplifyのauthに最低限のコード追加で実現できます。
シークレットを使うため、またリダイレクトURI設定のため、何度かデプロイする必要があります。
- ソースコードの変更(Amplify認証設定 + フロントエンド)
- GitHubへプッシュ & Amplifyデプロイ(失敗)
- シークレットの設定
- Amplify再デプロイ(成功)
- Cognitoの値取得
- Google Cloud設定
- シークレットの更新
- ソースコードの変更
- GitPush & Amplifyデプロイ
もう少しスマートな手順があれば教えてくださいm(_ _)m
1. ソースコードの変更
ベースとなるAmplifyテンプレートは以下を使っています。
ソースコードを次のように修正してください。
GoogleのクライアントIDとシークレットはAmplifyのsecretから取り出すようにします。
import { defineAuth } from "@aws-amplify/backend";
/**
* 認証リソース定義
*
* プロジェクトに合わせて認証設定を編集してください。
* 参考: https://docs.amplify.aws/nextjs/build-a-backend/auth/
*/
export const auth = defineAuth({
loginWith: {
email: true,
},
});
import { defineAuth, secret } from "@aws-amplify/backend";
export const auth = defineAuth({
loginWith: {
email: true,
externalProviders: {
google: {
clientId: secret("GOOGLE_CLIENT_ID"),
clientSecret: secret("GOOGLE_CLIENT_SECRET"),
scopes: ["email", "profile", "openid"],
attributeMapping: {
email: "email",
fullname: "name",
profilePicture: "picture",
},
},
callbackUrls: [
"http://localhost:3000/",
"https://<your-app>.amplifyapp.com/", // 本番,開発ドメインが決まったら追加
],
logoutUrls: [
"http://localhost:3000/",
"https://<your-app>.amplifyapp.com/", // 本番,開発ドメインが決まったら追加
],
},
},
});
フロントエンドについては、1行importを追加するだけです。
import "aws-amplify/auth/enable-oauth-listener";
2. Amplifyデプロイ
GitHubにPushして、Amplifyへデプロイします。
AWSコンソールからAmplifyを開いて、新しいアプリを作成します。

シークレットの設定がないためデプロイは失敗します。(想定通り)

3. シークレットの設定
Amplifyのアプリを開いて、ホスティング → シークレット → シークレットを管理 と進めます。

次のようにシークレットを設定します。値はとりあえず Dummy としておきます。
| 変数 | 値 |
|---|---|
| GOOGLE_CLIENT_ID | Dummy |
| GOOGLE_CLIENT_SECRET | Dummy |
4. Amplify再デプロイ
デプロイ画面を開いて、このバージョンを再デプロイ を実行します。

5. Cognitoの値取得
Cognitoが作成されるので、AWSコンソールからCognitoのユーザプールを開きます。

ドメインを開いて、今回作成されたドメインを取得します。
https://<your-cognito-domain>.auth.<region>.amazoncognito.com/
6. Google Cloud設定
続いてGoogle側の設定をしていきます。
まずは、Google Cloud Console にアクセスします。
GCP (Google Cloud Platform) は旧称みたいですね。現在は Google Cloud が正式名称。
プロジェクト作成
アプリ情報の登録
OAuthクライアントの作成
承認済みのJavaScript生成元に、先ほど取得したCognitoのドメイン情報を入力します。
https://<your-cognito-domain>.auth.<region>.amazoncognito.com

承認済みのリダイレクトURIも以下のとおり設定して、作成。
https://<your-cognito-domain>.auth.<region>.amazoncognito.com/oauth2/idpresponse

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

公開ステータスの変更
対象を選択すると、公開ステータスがテスト中になっていると思いますので、アプリの公開を選択。

アプリの内容がOAuth認証だけであればすぐに本番に変わりますが、他の機能なども有していると審査に時間を要することもあるようです。
また、ステータスがテスト中のままだと更新トークンが7日で期限切れになります。
7. シークレットの更新
Amplifyに戻ります。
ホスティング → シークレットと進みます。シークレットを管理を選択します。

先ほど取得した クライアントID と クライアントシークレット の値で、シークレットを更新します。

8. ソースコードの変更
Google認証後、Cognitoからトップ画面へリダイレクトするためのURLを設定します。
手順1でとしていた箇所を、Amplifyで払い出された実際のドメインに書き換えます。
callbackUrls: [
"http://localhost:3000/",
"https://<your-app>.amplifyapp.com/", // 本番,開発ドメインが決まったら追加
],
logoutUrls: [
"http://localhost:3000/",
"https://<your-app>.amplifyapp.com/", // 本番,開発ドメインが決まったら追加
],
9. Amplifyデプロイ
GitHubにPushすると自動でAmplifyデプロイが始まります。
完了するまでしばらく待ちます。

動作確認
それではデプロイ完了したら動作確認をしてみます。
トップ画面にアクセスすると、Cognitoログイン画面が表示されます。
上部に設置されたSign In with Googleからログインを進めます。

Cognito
最後にCognitoでどのようにユーザ登録されているか見ておきます。
AWSコンソールでCognitoを開いて、対象のユーザプールのユーザーを選択します。

ユーザーの詳細を確認すると、ユーザー属性としてGoogleから受け取った情報が保持されていることがわかります。

以上が設定手順となります。
お片付け
動作検証が終わったらお片付けをしておきます。
AWS Amplify
AWSコンソールでAmplifyを開いて、対象アプリの アプリケーションの設定 → 全般設定 と進み、アプリの削除を実行。
Cognito等のバックエンドリソースも削除されます。

Google Cloudプロジェクト
Google Cloudのコンソールで対象のアプリケーションのダッシュボードを開きます。

プロジェクトIDを入力して、このままシャットダウンを選択します。

まとめ
今回はCognitoの認証にソーシャルログインプロバイダーとしてGoogle Cloudを追加してみました。
設定に多少の手間はかかるものの、プログラム自体は最小限のコード変更で実現できました。
皆さんのご参考になれば幸いです。
他のプロバイダーでの認証についても気になるので、もう少し確認してみようと思います。
LINE ログインの追加手順はこちらの記事にまとめました。



























