7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Firebase JS SDK v9 でログイン認証(Authentication)をする時の変更点

Posted at

またFirebaseのv9.0.0以降の変更点です。
プログラミング初心者なので誤りがあるかもしれません。
その際はご指摘お願いいたします。

Firebase Authenticationをこれから使用する人向け

Firebase v9はつい先日(2021/08/25)アップデートが行われ、正式にv9.0.0になりました。
npm install --save firebase
ってバージョンを明示せずにインストールするとv9になってるってことですね。
大きな変更点としては、Option API方式からComposition API方式になった事です。
といっても私もよくわかんないのでコードで説明すると、

v8_10_0.js
import firebase from "firebase/app"
import "firebase/auth"

const config = {
  //...
}

firebase.initializeApp(config);
const auth = firebase.auth();
v9_0_0.js
import { initializeApp } from "firebase/app"
import { getAuth } from "firebase/auth"

const config = {
  //...
}

initializeApp(config);
const auth = new getAuth();

のように、特定の関数をimportで明示的に呼び出す形のことをComposition APIと呼ぶようで、Vue3でも同様にComposition APIを使用するように変更が行われています。
これはページのロード高速化のためで、そりゃ毎回ライブラリ全部をimportするより明示的に一部分をimportした方が速いよねってことだと理解してます。

これからFirebaseやVue.jsで何かを作る場合は、Composition APIでコードを書くようにした方がいいみたいですね。

だいたいの引数にgetAuth()を入れる

色々なFirebase v8以前のサンプルコードを見ながら、どうv9に対応させればよいのか悩みましたが結局getAuth()を使えばほとんど解決する事に気づきました。
当然と言われれば当然なんですが…。

例えばセッションの永続性を設定するsetPersistence()だと、

v8_10_0.js
import firebase from "firebase/app"
import "firebase/auth"

firebase.auth().setPersistence(firebase.auth.Auth.Persistence.SESSION).then(() => {
  //...
}
v9_0_0.js
import { getAuth, setPersistence, browserSessionPersistence } from "firebase/auth"

setPersistence(getAuth(), browserSessionPersistence).then(() => {
  //...
}

と書きます。
ここでの違いは、Composition APIだと関数の引数にAuthインスタンスを含むようになっていて、ここにgetAuth()を入れると解決します。
getAuth()は既存のAuthインスタンスを呼ぶか、既存のAuthインスタンスが無ければ新規でAuthインスタンスを生成します。
なので、firebase.js等のファイルで最初に初期化をし、setPersistence()でセッションの永続性を設定しておけばあとはFirebase Authenticationを使いたいところでgetAuth()を引数に入れておけばよいみたいです。

FirebaseのCodelabにあるサンプルコード(Friendly-chat)でも、最初に初期化した後は全部getAuth()してるので多分合ってます。

私がしてた勘違い

私が色んなサイトを見て混乱してたのは、例えばfirebase.jsでAuthインスタンスの初期化をした時に

import { getAuth } from "firebase/auth"
const auth = new getAuth();

export { auth }

として、それを他のAuthenticationを使いたい場所で

import auth from "@/firebase.js"
import { signOut } from "firebase/auth"

signOut(auth).then(() => {
  //...
}

と書く必要があるのかと思って混乱していました。
実際にはこんな事をせずに、

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

signOut(getAuth()).then(() => {
  //...
}

同じ勘違いをされる方がいらっしゃるかはわかりませんが、そう解説してあるサイトもあったので一応…。(そのコードではそう書く必要があったのかもしれません。)

Firebase Authentication の初期化

onAuthStateChanged() の使い方で3~4日悩んだんですが、こうすればいいってわかったのでまた別投稿で書きます。

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?