Nuxt を使った Firebase での Google ログインが驚くほど簡単だった

# はじめに
Firebase での Google ログインを実装してみたところ驚くほど簡単に実装できたので、今回備忘録も兼ねてご紹介できればと思います。

# 目次
1. firebase 上でプロジェクトを作成
1. Authenticationを有効化
1. Firebase SDK のインストール
1. Firebase 設定ファイルの作成(認証疎通)
1. Google ログイン機能の実装
1. 実際の画面
1. 余談
1. 終わりに


:::note warn
注意
Nuxt での Firebase key の管理方法(環境変数化)や本番環境へのデプロイに関する詳細には触れておりません。
:::

# firebase 上でプロジェクトを作成
1. FIrebase に任意のアカウントでログイン(or 新規登録)を行います。
1. 任意のプロジェクト名を入力して、プロジェクトの作成を行います。

![スクリーンショット 2024-12-05 22.48.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1445545/7b391aba-3862-9483-e26b-46ebe165f55c.png)

# Authenticationを有効化

1. 「構築」から Authentication を選択します
1. 「始める」をクリックしてください

![スクリーンショット 2024-12-05 22.51.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1445545/20586b53-47d4-8125-2a71-7a12ee102f29.png)

なぜ Authentication を有効化するかというと、 Google ログイン機能を実装する際に、Google プロバイダでのログインを有効にしなければならないためです。

![スクリーンショット 2024-12-05 22.56.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1445545/35327fc0-5bde-0c10-d941-46be9b0db36a.png)


余談ですが、Google 以外にもメール / パスワード, Github アカウント, Twitter アカウントを用いたログイン機能も可能なので、興味がある方はぜひ試してみてください。

![スクリーンショット 2024-12-05 22.58.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1445545/9e827f0c-6a64-6528-cf29-bcf66c4654bd.png)

その後、ウェブアプリへの Firebase の追加を行います。
※ 「Firebase SDK の追加」は、後ほど行うので、この段階ではスキップして問題ありません。
無事にウェブアプリへの追加が完了したら、「プロジェクトの設定」画面に遷移をしてください。

下部の「マイアプリ」をみていただくと、 SDK の利用に必要な config 情報が記載されいていますので、こちらをメモしてください。

恐らく、下記のような config 情報が記載されていると思います。

```JS
const firebaseConfig = {
    apiKey: {Firebase API Key},
    authDomain: {Firebase Auth Domain},
    projectId: {Firebase Project ID},
    storageBucket: {Firebase Storage Bucket},
    messagingSenderId: {Firebase Messaging Sender ID},
    appId: {Firebase App ID}
}
```

# Firebase SDK のインストール
次に、開発環境へ Firebase SDK のインストールを行います。

ターミナルで下記のコマンドを実行してください

``` bash
npm install firebase

// yarn の場合は

yarn add firebase
```

# Firebase 設定ファイルの作成(認証疎通)
パッケージのインストールは完了したら、設定ファイルの作成を行います。
私の場合は、Nuxt Plugins として設定し、認証情報は Nuxt Runtime Config を用いて環境変数から取得しています。

ウェブアプリへの追加を行なった際に取得にした認証情報をこちらに貼り付け、Firebase App / Firebase Auth モジュールのユーティリティ関数を呼び出して、 Firebase アプリの初期化と認証の取得を行います。

``` TS
import { initializeApp } from 'firebase/app'
import { getAuth } from 'firebase/auth'

export default defineNuxtPlugin((nuxtApp) => {
    const config = useRuntimeConfig()

    // Firebase 認証情報
    const firebaseConfig = {
        apiKey: config.public.firebaseApiKey,
        authDomain: config.public.firebaseAuthDomain,
        projectId: config.public.firebaseProjectId,
        storageBucket: config.public.firebaseStorageBucket,
        messagingSenderId: config.public.firebaseMessagingSenderId,
        appId: config.public.firebaseAppId
    }

    // Firebase アプリの初期化
    const firebaseApp = initializeApp(firebaseConfig)
    
    // Firebase 認証の取得
    const auth = getAuth(firebaseApp)

  nuxtApp.provide('auth', auth)
})
```

# Google ログイン機能の実装
設定ファイルの作成が終わったら、実際に機能を実装します。
`signInWithPopup` を利用してログインポップアップを表示し、ユーザー認証を行います。

```Vue
<template>
  <div class="login">
    <h2>ログイン画面</h2>
    <button @click="loginWithGoogle">Googleでログイン</button>
  </div>
</template>

<script setup lang="ts">
import { GoogleAuthProvider, signInWithPopup } from 'firebase/auth'

const { $auth } = useNuxtApp()

/**
 * Google アカウントでのログイン処理
 */
const loginWithGoogle = async (): Promise<void> => {
  // Google の認証プロバイダーを初期化
  const provider = new GoogleAuthProvider()

  try {
    // Google のログインポップアップを表示し、ユーザー認証
    await signInWithPopup($auth, provider)
    navigateTo('/')
  } catch (error) {
    console.error('Google ログインエラー:', error)
  }
}
</script>
```

# 実際の画面
これで Google ログインの実装は完了です。
実際にログイン処理を行うと、以下のようなポップアップが表示されます。

![スクリーンショット 2024-12-07 10.22.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1445545/ad2f0da5-91a6-c5d4-ecaa-8394cd3439ad.png)

無事にログイン処理が完了すると、Firebase 上のプロバイダーに該当のアカウントが追加されているので確認してみてください。

![スクリーンショット 2024-12-07 10.27.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1445545/3d8b7164-c158-66cf-7e68-251a9728ac33.png)

ちなみに、 `signInWithPopup` の返り値から、ログインした Google アカウント名も簡単に取得できるので試してみてください。
詳しい内容は、下記のドキュメントを参考にしてください。

https://firebase.google.com/docs/reference/js/auth.usercredential?hl=ja

# 余談

## 管理者権限を必要とする機能の追加
管理者権限を必要とする機能を追加したい場合は、 Firebase Admin SDK がおすすめです。
例えば、ユーザー情報の編集や削除、権限の追加などができるようになります。

```bash
npm install firebase-admin

// yarn の場合は

yarn add firebase-admin
```

使用できるユーティリティ関数などの詳しい詳細は、下記のドキュメントを参考にしてください。

https://firebase.google.com/docs/reference/admin/node/firebase-admin?hl=ja

# 終わりに
Firebase の Authentication を用いれば、今回のようなプロバイダごとのログイン処理の実装はもちろん、ドメインごとにログイン制限を設定できたりと、カスタムされたログイン処理も比較的簡単に実装できるので、今後も積極的に活用したいです。