Firebase v9 + Vue.js + Vuetifyを試してみる　～ログイン機能編～

<h1>はじめに</h1>
Firebaseを使ってみたい！と思い、ダイアログからアカウントの新規登録およびログインができる簡単なアプリケーションを作ってみました。

Firebase Authenticationを用いています。

<h1>環境</h1>
Firebase: 9.5.0<br>
Vue: 2.6.11<br>
Vuetify: 2.4.0<br>

<h1>Vue プロジェクトの作成</h1>
今回はVuetifyを用いるため、Vue2でプロジェクトを作成します。

```cmd:cmd
vue create firebasetest
```

Firebasetestにディレクトリに移動してVuetifyをインストール

```cmd:cmd
cd firebasetest
vue add vuetify
```

npm run serveしてlocalhostにアクセス

```cmd:cmd
npm run serve
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2330052/7772aeb7-0ce7-103a-05fc-ddd3bd910865.png)
OKですね。

<h1>ログイン画面の作成</h1>
ユーザー名とパスワードを入力するダイアログを作成します。
LoginDialog.vueを新規作成。

```vuejs:LoginDialog.vue
<template>
  <v-row justify="center">
    <v-dialog v-model="dialog" persistent width="400px">
      <v-card>
        <!-- タイトル -->
        <v-card-title>
          <span class="text-h5">認証</span>
        </v-card-title>
        <v-card-text>
          <!-- 入力項目 -->
          <v-text-field v-model="email" label="e-mail" required></v-text-field>
          <v-text-field v-model="password" label="Password" required></v-text-field>
        </v-card-text>
        <v-card-actions>
          <v-spacer></v-spacer>
          <!-- ボタン -->
          <v-btn color="blue darken-1" text @click="signUp()"> 登録 </v-btn>
          <v-btn color="blue darken-1" text @click="signIn()"> ログイン </v-btn>
        </v-card-actions>
      </v-card>
    </v-dialog>
    <!-- 新規登録もしくはログインした後に出現するSnackbar(Toast) -->
    <v-snackbar v-model="showSnackbar">{{ snackbarMessage }}</v-snackbar>
  </v-row>
</template>

<script>
export default {
  name: "LoginDialog",

  data: () => ({
    dialog: true,
    email: "",
    password: "",
    snackbarMessage: "",
    showSnackbar: false,
  }),
  methods: {
    signUp() {
      // アカウント登録処理
    },
    signIn() {
      // ログイン処理
    },
  },
};
</script>
```

App.vueもヘッダーのみのシンプルなページになるように書き換えます。
```vuejs:App.vue
<template>
  <v-app>
    <v-app-bar
      app
      color="primary"
      dark
    >
    </v-app-bar>

    <v-main>
      <LoginDialog/>
    </v-main>
  </v-app>
</template>

<script>
import LoginDialog from './components/LoginDialog';

export default {
  name: 'App',

  components: {
    LoginDialog,
  },

  data: () => ({
    //
  }),
};
</script>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2330052/36ae6cd9-d395-30cb-873e-f3e3d8c75093.png)

このような画面になりました。

<h1>Firebareの導入</h1>
Firebaseの導入です。

https://console.firebase.google.com/u/0/?hl=ja

ログインして画面の左上からプロジェクトを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2330052/d58f6e19-df04-3d19-117c-d381b4a5f9db.png)

プロジェクト名を入力。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2330052/d143c95a-75c5-39a6-94ad-3190eb54b607.png)

続行→続行で作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2330052/21d7b78d-a86b-7e23-1a3f-1af09fc16e1d.png)

</>を選択→アプリ名を入力してアプリの登録

できたら以下のコマンドでfirebaseをnpmインストール。

```cmd:cmd
npm install firebase
```
新規にfirebase.jsを作成します。
firebaseConfig は、firebaseのプロジェクトのページ → プロジェクトの設定 → [全般]タブ → 画面中央に記載されています。

```javascript:firebase.js
// Import the functions you need from the SDKs you need
import { initializeApp } from "firebase/app";
import { getAuth } from "firebase/auth";

// TODO: Add SDKs for Firebase products that you want to use
// https://firebase.google.com/docs/web/setup#available-libraries

// Your web app's Firebase configuration
// For Firebase JS SDK v7.20.0 and later, measurementId is optional
// Your web app's Firebase configuration
const firebaseConfig = {
  apiKey: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  authDomain: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  projectId: "XXXXXXXXXXXXX",
  storageBucket: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  messagingSenderId: "XXXXXXXXXXXXX",
  appId: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
  measurementId: "XXXXXXXXX"
};

// Initialize Firebase
initializeApp(firebaseConfig);
export const auth = getAuth()
```

<h1>ログイン設定・アカウントの追加</h1>
FirebaseのホームでAuthenticationを選択。
そこでメールを選択します。

有効にして保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2330052/d251c4c5-e53f-df14-f359-48cb5a41e868.png)

手動でアカウントを追加することもできます。
ユーザーを追加からメールアドレスとパスワードを入力して登録。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2330052/7d7fa0d7-0ab2-3114-a99d-3fbc1190ab31.png)

<h1>新規登録・ログイン処理の実装</h1>
最後に新規登録・ログイン処理の実装です。

少ない記述で簡単に新規登録・ログイン処理が実装できました。

```vuejs:LoginDialog.vue
<template>
  <v-row justify="center">
    <v-dialog v-model="dialog" persistent width="400px">
      <v-card>
        <!-- タイトル -->
        <v-card-title>
          <span class="text-h5">認証</span>
        </v-card-title>
        <v-card-text>
          <!-- 入力項目 -->
          <v-text-field v-model="email" label="e-mail" required></v-text-field>
          <v-text-field v-model="password" label="Password" required></v-text-field>
        </v-card-text>
        <v-card-actions>
          <v-spacer></v-spacer>
          <!-- ボタン -->
          <v-btn color="blue darken-1" text @click="signUp()"> 登録 </v-btn>
          <v-btn color="blue darken-1" text @click="signIn()"> ログイン </v-btn>
        </v-card-actions>
      </v-card>
    </v-dialog>
    <!-- 新規登録もしくはログインした後に出現するSnackbar(Toast) -->
    <v-snackbar v-model="showSnackbar">{{ snackbarMessage }}</v-snackbar>
  </v-row>
</template>

<script>
// 追加
import { auth } from "../firebase";
// 追加
import {
  createUserWithEmailAndPassword,
  signInWithEmailAndPassword,
} from "firebase/auth";

export default {
  name: "LoginDialog",

  data: () => ({
    dialog: true,
    email: "",
    password: "",
    snackbarMessage: "",
    showSnackbar: false,
  }),
  methods: {
    signUp() {
      // アカウント登録処理
      // 追加
      createUserWithEmailAndPassword(auth, this.email, this.password)
        .then((userCredential) => {
          this.snackbarMessage = "新規登録成功！" + userCredential.user.email + " 様";
          this.showSnackbar = true;
        })
        .catch((error) => {
          this.snackbarMessage = "新規登録失敗。。。";
          this.showSnackbar = true;
          console.log("error code: " + error.code);
          console.log("error message: " + error.message);
        });
    },
    signIn() {
      // ログイン処理
      // 追加
      signInWithEmailAndPassword(auth, this.email, this.password)
        .then((userCredential) => {
          this.snackbarMessage = "ログイン成功！" + userCredential.user.email + "様";
          this.showSnackbar = true;
        })
        .catch((error) => {
          this.snackbarMessage = "ログイン失敗。。。";
          this.showSnackbar = true;
          console.log("error code: " + error.code);
          console.log("error message: " + error.message);
        });
    },
  },
};
</script>
```
<h1>トラブったこと</h1>
新規登録ができなかった → 新規登録時のpasswordが簡単すぎた。

<h1>参考</h1>

https://firebase.google.com/docs/web/setup?hl=ja

https://zenn.dev/knaka0209/articles/9472e94612a6f0

<h1>最後に</h1>
（実際の画面ではもちろん新規登録とログイン画面はわけたほうがいいと思いますが）シンプルな画面でFirebaseの新規登録とログインを試すことができました。

次はRealtime Databaseに挑戦してみたいと思います。