技術メモ

習得したIT技術の備忘録

【Nuxt+Firebase Authentication 】ソーシャルログイン実装方法

Nuxt+Firebase Authenticationを使用したソーシャルログイン実装方法を紹介します。

完成イメージ

今回はGoogle アカウントを使った認証機能を行います。

ソーシャルログインの完成イメージ
完成イメージ

1.ソーシャルログインとは

ソーシャルログインとは、ユーザーが使い慣れた既存WebサービスSNSのアカウントを利用して、別のWebサービスにログインできる仕組みのことです。

connpassのログイン画面(ソーシャルログインが導入されている)
connpassのログイン画面

面倒なアカウント作成から解放されユーザとしても嬉しい、そしてログイン処理を自分たちで書かなくていい!という開発者としても嬉しい仕組みです。

そんなソーシャルログインを簡単に実装できるのがFirebaseで提供されている Authenticationです。

Firebase Authentication は、バックエンド サービス、使いやすい SDK、アプリでのユーザー認証に使用できる UI ライブラリが用意されています。
パスワード、電話番号、一般的なフェデレーション ID プロバイダ(GoogleFacebookTwitter)などを使用した認証を行うことができます。

2.実装方法

2-1Firebaseでの作業

(1)Firebaseプロジェクトの作成する

①「プロジェクトを作成」を押下する

firebaseログイン後トップページ

②プロジェクト名を入力する
プロジェクト名入力画面

③「続行」を押下する
googleアナリティクス同意画面

④「プロジェクトを作成」を押下する
googleアナリティクス構成画面
プロジェクトが作成されます
プロジェクト作成完了

(2)Authentication の設定

①「Authentication」を選択する
f:id:tecmemo_y:20201206160412p:plain:w300

②「Sing-in-method」タブにて、ログイン許可するプロバイダを選択する
f:id:tecmemo_y:20201206160557p:plain:w300

③「有効にする」に変更し、「保存」を押下する
f:id:tecmemo_y:20201206160631p:plain:w300

Googoleが有効になります
f:id:tecmemo_y:20201206160715p:plain:w300

(3)ウェブ設定の確認

①「プロジェクトを設定」を選択する
f:id:tecmemo_y:20201206160857p:plain:w300

②「プロジェクト名」「ウェブAPIキー」をメモ帳等に控える
f:id:tecmemo_y:20201206160925p:plain:w300
2-2Nuxtプロジェクトでの作業で使用します。

2-2Nuxtプロジェクトでの作業

(1)Nuxtプロジェクトの作成

以下コマンドにてプロジェクトを作成する

npm init nuxt-app <project-name>

npx, yarnでも作成可能です。詳細は以下参照
インストール - NuxtJS

(2)Firebase SDK の追加

①「cd」コマンドで上記プロジェクトに遷移する
②以下コマンドにてFirebase SDK をインストールする

npm install --save firebase

CDNでも追加可能です。詳細は以下参照
Add Firebase to your JavaScript project

(3)ログイン処理の実装

①firebaseをインポートする

import firebase from 'firebase'

②ログイン処理を入れたい箇所に以下コードを追加する

      const config = {
        // 2-1Firebaseでの作業-(3)ウェブ設定の確認の値 
         apiKey: 'ウェブAPIキー', 
         authDomain: '(プロジェクト名).firebaseapp.com',
       }

      firebase.initializeApp(config)

      const provider = new firebase.auth.GoogleAuthProvider()
      firebase
        .auth()
        .signInWithPopup(provider) // ポップアップでログイン画面を表示 ※1
        .then(function (result) {
        // 成功時の処理 ※2
        })
        .catch(function (error) {
           // エラー時の処理
        })

※1 signInWithPopup(provider)signInWithRedirect(provider)に変更することで
ログイン画面をリダイレクトに変更できます。

※2 resultで取得できる値については以下参照
UserInfo  |  Identity Platform のドキュメント  |  Google Cloud

(4)ログアウト処理の実装

ログアウト処理を入れたい箇所に以下コードを追加する

      firebase
        .auth()
        .signOut()
        .then(function () {
          // 成功時の処理
        })
        .catch(function (error) {
          // エラー時の処理
        })
(5)ログイン状態確認処理の実装

ログイン状態確認処理を入れたい箇所に以下コードを追加する

    firebase.auth().onAuthStateChanged(function (user) {
      if (user) {
        // ログイン中
      }
(6)ログイン・ログアウト・状態確認の実装例
<template>
  <div>
    <section class="container">
      <h1>{{ title }}</h1>
      <button v-if="!isLogin" @click="onClickLogin">Login</button>
      <button v-if="isLogin" @click="onClickLogout">Logout</button>
      <table v-if="isLogin">
        <tr>
          <th>Name</th>
          <td>{{ name }}</td>
        </tr>
        <tr>
          <th>Email</th>
          <td>{{ email }}</td>
        </tr>
      </table>
    </section>
  </div>
</template>

<script>
import firebase from 'firebase'

export default {
  data() {
    return {
      title: 'Firebase Auth Sample',
      name: '',
      email: '',
      isLogin: false,
      config: {
         apiKey: 'ウェブAPIキー', 
         authDomain: '(プロジェクト名).firebaseapp.com',
      },
    }
  },
  created() {
    firebase.initializeApp(this.config)
    const self = this
    firebase.auth().onAuthStateChanged(function (user) {
      if (user) {
        self.isLogin = true
        self.email = user.email
        self.name = user.displayName
      }
    })
  },
  methods: {
    onClickLogin() {
      const provider = new firebase.auth.GoogleAuthProvider()
      const self = this
      firebase
        .auth()
        .signInWithPopup(provider)
        .then(function (result) {
          self.isLogin = true
          self.email = result.user.email
          self.name = result.user.displayName
        })
    },
    onClickLogout() {
      if (!confirm('ログアウトしますか?')) {
        return
      }
      const self = this
      firebase
        .auth()
        .signOut()
        .then(function () {
          self.isLogin = false
        })
        .catch(function (error) {
          console.log(error)
        })
    },
  },
}
</script>  

今回は1ファイルでまとめていますが、状態管理はVuexで管理した方が初期表示がきれいになると思います。

参考サイト

Authenticate Using Google Sign-In with JavaScript  |  Firebase

Vue.js&Nuxt.js超入門

Vue.js&Nuxt.js超入門