Firebase Authentication(v9)とNextで認証機能を実装する

はじめに

FirebaseのSDKのバージョンが9に変わって実装方法が変わったので記事を書くことにしました。

この記事を書いた人

@takasqr アプリケーション開発が大好きなエンジニア。Vue、Swift、Electrom などでアプリを作って公開している。AWS や Firebase などのクラウドサービスも好き。

構成

  • Firebase Authentication(v9)
  • Next

Firebase Authenticationとは?

Firebase Authenticationは、一言で言うと「ログイン機能を簡単に作ることが出来るクラウドサービス」です。

Firebaseは現在Googleによって運営されています。

できる事

Firebase上にユーザーを作って管理していくことができます。

ログイン方法は、

  • メールアドレス
  • Googleアカウント
  • Twitterアカウント
  • Microsoftアカウント
  • Gitgubアカウント
  • Appleアカウント
  • Facebookアカウント
  • 電話番号認証
  • カスタム認証
  • 匿名認証

と豊富にあります。

また、ユーザーに「管理者ユーザー」、「一般ユーザー」等のラベル付けすることもできます。

【Firebase】カスタムクレーム(Custom Claims)で管理者ユーザーを作る | ライトリ

料金

電話認証以外は無料で使うことができます。

料金プラン | Firebase

メリット

FirebaseはGoogleのサービスなので、ほとんどの人にとってセキュリティは上がると思います。ほかにもFirebase Authentication公式ライブラリがあるので、自分で作るより開発工数を短縮することができます。

Next.jsとは?

Next.jsは一言で言うと、「フロントエンド(ブラウザ)で動く、javascriptのフレームワーク」です。

Firebaseを初期化

Firebaseを使うためには、初期化処理を行う必要があります。

import Head from 'next/head'

import FirebaseAuthUserInfo from '../src/firebase/FirebaseAuthUserInfo';
import FirebaseAuthSigninButton from '../src/firebase/FirebaseAuthSigninButton';
import FirebaseAuthSignupButton from '../src/firebase/FirebaseAuthSignupButton';
import FirebaseAuthGoogleButton from '../src/firebase/FirebaseAuthGoogleButton';
import FirebaseAuthSignoutButton from '../src/firebase/FirebaseAuthSignoutButton';

import { initializeApp } from 'firebase/app';

const firebaseConfig = {
  apiKey: 'AIzaSyDf9wc8MCB3H_gmvQbxsuBTo5QCadRu8tg',
  authDomain: 'litely-f6e0d.firebaseapp.com',
  projectId: 'litely-f6e0d',
  storageBucket: 'litely-f6e0d.appspot.com',
  messagingSenderId: '400014490635',
  appId: '1:400014490635:web:47198f41e8f33d603e5b0e',
  measurementId: 'G-9Z9X0FJZRL'
}

console.log('firebase')
initializeApp(firebaseConfig);

export default function Home() {
  return (
    <div>
      <Head>
        <title>Create Next App</title>
        <link rel="icon" href="/favicon.ico" />
      </Head>

      <main>
        <FirebaseAuthUserInfo />
        <FirebaseAuthSignupButton />
        <FirebaseAuthSigninButton />
        <FirebaseAuthGoogleButton />
        <FirebaseAuthSignoutButton />
      </main>
    </div>
  )
}

ユーザー作成

import { getAuth, createUserWithEmailAndPassword } from 'firebase/auth'

const clickButton = () => {
  const emailAddress = '[email protected]'
  const password = 'Password'

  const auth = getAuth()
  createUserWithEmailAndPassword(auth, emailAddress, password)
    .then((userCredential) => {
      console.log('user created')
    })
    .catch((error) => {
      alert(error.message)
      console.error(error)
    })
}

function FirebaseAuthSignupButton() {
  return (
    <div>
      <button onClick={clickButton}>ユーザー作成</button>
    </div>
  );
}
  
export default FirebaseAuthSignupButton;

ログイン

import { getAuth, signInWithEmailAndPassword } from 'firebase/auth'

const clickButton = () => {
  try {
    const auth = getAuth();
    const emailAddress = '[email protected]'
    const password = 'Password'

    signInWithEmailAndPassword(auth, emailAddress, password)
      .then((user) => {
        console.log('ログイン成功', user)
      })
      .catch((error) => {
        console.error(error)
      })
  } catch (e) {
    console.error(e)
  }
}

function FirebaseAuthSigninButton() {
  return (
    <div>
      <button onClick={clickButton}>ログイン</button>
    </div>
  );
}

export default FirebaseAuthSigninButton;

Googleアカウント

googleアカウントでログインするコードです。

import { getAuth, GoogleAuthProvider, signInWithPopup } from 'firebase/auth'

const clickButton = () => {
  const provider = new GoogleAuthProvider()

  const auth = getAuth()
  signInWithPopup(auth, provider)
    .then((result) => {
      console.log('Googleアカウントでログインしました。')
    }).catch((error) => {
      console.error(error)
    })
}

function FirebaseAuthGoogleButton() {
  return (
    <div>
      <button onClick={clickButton}>Googleアカウントでログイン</button>
    </div>
  );
}

export default FirebaseAuthGoogleButton;

ログアウト

import { getAuth, signOut } from 'firebase/auth'

const clickButton = () => {
  const auth = getAuth()
  signOut(auth).then(() => {
    // Sign-out successful.
    alert('サインアウトしました。')
  }).catch((error) => {
    // An error happened.
    console.error(error)
  })
}

function FirebaseAuthSignoutButton() {
  return (
    <div>
      <button onClick={clickButton}>ログアウト</button>
    </div>
  );
}
  
export default FirebaseAuthSignoutButton;

NextでFirestore(v9)を操作するにはこちら。