VercelにホストしているNext.jsアプリにFirebaseでGoogleログイン機能を加える

# はじめに

AIアプリ生成ツールv0を試したのがきっかけで、Next.jsで授業用のアプリを作ってVercelにホストさせる勉強をしてます。その中で、いままでGoogle Apps Scriptで作っていたGoogleアカウントログイン機能付きのアプリをNext.js+Firebaseで作ってみようとしたのですが、（不慣れな自分には、、、）設定周りが想像以上に難しかったので備忘録を残します。ちなみに、**ChatGPT o1 proを含め、AIは問題解決に殆ど役に立たなかったです**。昔ながらのブログやフォーラムの投稿を見ながら収集した知見を共有します。

完全初心者なので、勘違いや間違いがあったらごめんなさい。コメントいただければ修正します。

# スタートポイント

初心者+AIも役に立たないので、ベースとなるプロジェクトを使います。

https://github.com/awinogrodzki/next-firebase-auth-edge

**next firebase auth edge**はNext.jsでFirebaseでのAuthenticationを行うためのパッケージです。中のExamples/next-typescript-starterにサンプルプロジェクトがあるので、これを使います。下の画像のようなログイン画面と機能が実装されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/c104d9d5-7168-6e72-f3f4-8979327342ac.png)

## Vercelプロジェクトの準備
ここからは、Vercel, Github, Google Cloud, Firebaseは既に使用可能である前提で話を進めます。作業環境はMacです。

まず、*next firebase auth edge*のGithubサイトのReleaseから最新版をダウンロードしてください。執筆時は[v1.8.2](https://github.com/awinogrodzki/next-firebase-auth-edge/releases/tag/v1.8.2)でした。ダウンロードしたら解凍。解凍したフォルダ（私は*next-firebase-auth-edge-1.8.2*のままにしました）を、とりあえず自分用のGithubリポジトリにpushしてください。

次に、Vercel上で新しいVercel Projectを作って、push先のレポジトリに紐づけます。

このとき、レポジトリ全体ではなく、今回使用する*next-typescript-starter*フォルダをRoot Directoryにしてください。それ以外のものは使いません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/8e593246-bf89-8498-f427-619119398fb6.png)

Root Directoryを選択したらDeployしてください。特にエラーなど無くDeployが終了するはずです。まだ何も設定してないので動作しませんが。ここで、いまのDeployの情報をDeployment Detailsから確認し、**Production Domain（デプロイ毎に変化しない、CurrentのProductionを指すやつ）をメモしてください。** 私は *vercel-tests....vercel.app*
 でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/422be351-22ad-c74a-34a5-29eb76a2017b.png)

# Firebase Webアプリの設定

次に、FirebaseでWeb Appを作ります。今回はFirebaseにアプリをホスティングするわけではないですが、ガワだけは作らないと動作しません。

まず、Firebaseでプロジェクトを作り、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/65bd1eb1-fa6f-e87e-ca97-e1c305e8cc77.png)

アプリ追加ボタンからウェブを選んで設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/331a70d1-b2bb-33f7-8b97-58d8b9684edb.png)

すると、ウェブアプリをFirebaseに追加するための画面になります。ここでFirebase Hostingは設定不要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/4e14d477-c8ec-767d-79b9-97413eb4ca22.png)

Firebase SDKに関する情報が出てきます。このなかのfirebaseConfigの情報が必要なので、どこかに保存しておいてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/e2405fc2-340e-ee32-5f4a-55d4cb822ce9.png)

保存したら、terminalで今回使用する *next-typescript-starter* フォルダに移動し、*yarn install*してください。プロジェクトのpackageにFirebaseが含まれるので、まとめてインストール出来ます。ちなみに、*npm install*しようとするとエラーになるので止めておきましょう。

次に TerminalでFirebase CLIを *npm install -g firebase-tools* でインストールします。そして*firebase login*で自分のGoogleアカウントにログインしたあとに、 *firebase use qiita...* のように、firebaseのところで作ったプロジェクトを指定してください。

次に*firebase init*して、設定画面になったらApp Hostingを選択してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/7d90480f-9dfd-71a7-6755-3c8f4c788f86.png)

すると、処理が走って初期化が終了します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/45ff787f-f6e8-f531-512e-a0df0b6902c6.png)

これにより、firebase.jsonという設定ファイルが作られるので、その内容をテキストエディタなどで以下のように修正してください。ダミーのホスティングに必要十分な最小構成です。
```
{
  "hosting": {
    "public": "public"
  }
}
```
修正したら、Terminalに戻って *firebase deploy --only hosting* でデプロイします。下の画像のようになったら成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/929aac56-1b4f-b902-b3d1-54959500eadf.png)

---

さて、ここまでFirebaseの作業をしたのは *init.json* というファイルを作らせるためです。成功したかどうかは、

https://(プロジェクトid).firebaseapp.com/__/firebase/init.json

にブラウザでアクセスすればわかります。上手くいってるときは、下のようにプロジェクトのjsonが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/ddb56b16-fbac-2bb3-f38e-530bbfc7542b.png)

これを確認したら、Firebaseのコンソールに戻ってください。

# Firebase Authenticationの設定

Firebaseのコンソールに戻ったら、左の「構築」から*Authentication*を選んで「始める」を押してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/bc85a7f2-aff7-c59b-5268-1a27eaba99f5.png)

設定画面になったら、ログインプロバイダにGoogleを選び、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/f8a6af25-fcc7-28b5-922e-e9ab1243d60f.png)

トグルスイッチを「有効にする」にして、プロジェクトの設定をしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/aa12c365-47f4-c5c4-196d-fcfe3a73f09a.png)

設定を保存したら、Authenticationの画面の「設定」タブを選び、左のメニューから「承認済みドメイン」を選び、Vercelのプロジェクトのアプリのドメインを追加してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/abe47f9c-92c2-e9a2-b930-a2620f0ff4a1.png)

次に、左上の歯車アイコンから「プロジェクトの設定」を選び、「サービスアカウント」のタブでFirebase Admin SDKの画面を出します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/eb9c2674-e3ca-b58e-33de-fb51f265a07f.png)

その下にある「新しい秘密鍵を生成」で秘密鍵を作ってダウンロードしてください。ファイルにはprivate_keyを初めとする重要情報がありますので、なくさないようにしましょう。

---

次はログイン処理には必須ではないですが、今回のサンプルプロジェクトにはFirestoreを使った機能も含まれているので、一応追加します。同じく「構築」からFirestore Databaseを選択し、「データベースを作成」から設定してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/47b12604-a0fd-2e1d-940a-ed3b77b9e215.png)

設定したら、「ルール」から以下のようにルールを変更してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/582f4c1e-1adf-37f7-f6a8-009166a8a1f6.png)


# Next.jsプロジェクトの設定

Visual StudioやCursorなどでVercelプロジェクトのフォルダを開いたら、*.env.dist*ファイルを複製して *.env.local* へリネームしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/207baa18-aeb3-eda5-0d03-cae8f71dce59.png)

ここには、今までの作業で収集したVercelやfirebaseプロジェクトに関する情報を入力します。外に漏れると困る情報のなでクラウドにファイルはアップしないようにしましょう。

```
FIREBASE_API_KEY=AIza*********
FIREBASE_PROJECT_ID=qii****
FIREBASE_ADMIN_CLIENT_EMAIL=firebase-adminsdk-*****@******.iam.gserviceaccount.com
FIREBASE_ADMIN_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhk********uSfqy/esU8C/4yvskY=\n-----END PRIVATE KEY-----\n"

NEXT_PUBLIC_FIREBASE_API_KEY=AIzaS***********
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=vercel-tests-******.vercel.app
NEXT_PUBLIC_FIREBASE_PROJECT_ID=qii*****
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=79************
NEXT_PUBLIC_ORIGIN=https://vercel-tests-*********.vercel.app

USE_SECURE_COOKIES=false

COOKIE_SECRET_CURRENT=6Lch49AqAAAAAB************
COOKIE_SECRET_PREVIOUS=6GVAHILed0yfoJGogCgkZ*********
```
入力にあたっては、以下の点に注意してください

- **FIREBASE_ADMIN_PRIVATE_KEYは""で囲むが、他は不要**
- **NEXT_PUBLIC_FIREBASE_AUTH_DOMAINにはVercelプロジェクトのアプリのドメイン(httpとか不要)を入力**
- NEXT_PUBLIC_FIREBASE_DATABASE_URLは今回使わないので
- **NEXT_PUBLIC_ORIGINもVercelプロジェクトのアプリの公開URL(こちらはhttpsなど含める)を入力***
- COOKIE_SECRET_CURRENT, COOKIE_SECRET_PREVIOUSは任意の文字列を使う

---
こうして設定した環境変数は、Vercelプロジェクトにも登録する必要があります。Vercelプロジェクトの*Settings/Environment Variables*の設定画面に進み、(*Add Another*を押したあとに）*import .env*ボタンをクリックして、今作った*.env.local*ファイルを読み込んでください。ファイルの記入内容が反映されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/34367b58-d497-6dd0-8a91-0e2c30e21564.png)

ただし、Vercelプロジェクトのアプリはデフォルトでhttpsなので、USE_SECURE_COOKIESはTRUEにしてください。あと、秘密鍵のフォーマットがすこし変(""が無くなる、改行される)になってしまいますが、大丈夫です。ちなみに、秘密鍵のフォーマットが間違っていると、ログイン成功ページへのリダイレクトができなくなります。もしその症状がでたら、改めてEditorから直接ペーストしてください。

ここまで作業したら、ローカルの作業状態をGithubにpushして、VercelにDeployさせましょう。Deployが終了したら、Production Domainから開いてください。前と違って、今度はページがちゃんと表示されるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/9a728d7c-0cd2-a2cc-ada7-8e9b9ba34047.png)

ただし、Googleでログインしようとすると以下のエラーが出るのでログインできません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/caef5726-8ea6-6bd5-c70b-e026ab945065.png)

*エラー 400: redirect_uri_mismatch*とあります。これは、環境変数の設定でデフォルトのfirebaseのドメインではなくVercelの方のドメインを設定しているからです。その変更をGoogle Cloudに反映させないと動作しません。

# Google Cloudの設定

Google Cloudコンソールにて、Firebase上で作ったプロジェクトを選択して、Google Auth Platformのページへ移動してください。移動したら、左から「クライアント」を選び、OAuth 2.0 クライアント IDの一覧からWeb Clientをクリックしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/f36c3146-fab4-9e22-6784-c67b01a212fc.png)

すると、*承認済みの JavaScript 生成元* と *承認済みのリダイレクト URI* を入力する画面になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/cd06ba2a-b4c6-b225-3cb3-dc255beaa8d3.png)

ここでは**承認済みの JavaScript 生成元**として**VercelプロジェクトアプリのURL**, **承認済みのリダイレクト URIとして**VercelプロジェクトアプリのURLに __/auth/handler を追加したもの**を入力してください。ここが間違っているとログインが正常に完了しません。入力したら忘れずに保存してください。

ここまで出来たら、改めてログインしていましょう。*Log in with Google (Redirect)* を試してみてください。設定がすべてうまく行っていれば、Googleアカウント情報を入力したあとに下のログイン成功ページになるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/7dee5030-ca8c-e71c-6ed2-5d404880465b.png)

Profileページでは、Update counterボタンでFirestoreの*user-counters*をカウントアップできます（事前に*user-counters*を作っていなくても、勝手に作ってくれます）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/03147fa8-5ed6-6fe4-650d-37755d3395be.png)

# おわりに

こういうのもAIがちゃんと説明できるようになれば良いんですが。知識が不足した状況だと無駄な提案を延々と続けるので時間ばかり過ぎていきます。ある程度試してダメなら、人間の知識を探したほうが良いですね。