Posted at

Firebase で無料認証サービスを試してみた

More than 1 year has passed since last update.

無料でID管理ができる時代。そろそろ覚えないといけないと思った。


事前準備(Webブラウザで実行)



  • Firebase コンソール でプロフェクトを作成

  • DEVELOP> Authentication に遷移

  • 「SIGN-IN METHOD」タブで、パスワード認証を Enable にして

  • 「USERS」タブで、以下の実験で使うユーザを作成

Project Overview の設定アイコンから、以下を控える


  • Project ID

  • Web API Key


クライアント側

とりあえず Nodeで確かめたけど、ブラウザのJSでもほぼ手順は同様

まずは、SDKのインストール

npm i --save firebase

// browserの場合
// <script src="https://www.gstatic.com/firebasejs/4.10.1/firebase.js"></script>

SDKを初期化したら、ID(メールアドレス)とパスワードでログインして、JWTトークンを得る。

const firebase = require('firebase');

(async () => {
// initialize SDK
const config = {
apiKey: 'XXXXXXXXXXXXXXXXXXXXXX',
authDomain: 'XXXXXXXXXX.firebaseapp.com', // project ID
};
const app = firebase.initializeApp(config);

// authentication
const auth = app.auth();
const email = 'XXXXXXXXXXX@XXXXXXXXXX.com';
const password = 'XXXXXXXXXXX';
await auth.signInWithEmailAndPassword(email, password).catch(console.log);
const me = auth.currentUser;
console.log(me.email, me.emailVerified);

// retrieve JWT
const token = await me.getIdToken();
console.log(token);
})();


サーバ側

Firebase コンソール でサービスアカウントを作成


  • Project Overview の設定アイコンから設定画面に遷移

  • SERVICE ACCOUNTS タブからGENERATE NEW KEYをする


    • JSONがダウンロードされる。これは公開しちゃダメなファイル



アドミン用のSDKをインストール

npm i --save firebase-admin

クライアントの生成したJWTをバリデーションする。

const admin = require('firebase-admin');

const account = require('./key.json');

const token='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';

(async () => {
// initialize SDK
const credential = admin.credential.cert(account);
const app = admin.initializeApp({ credential });

// verify
const auth = app.auth();
const decoded = await auth.verifyIdToken(token).catch(console.log);
console.log(decoded.uid, decoded.email);
})();

IDとしては、 uid を用いるのがよい。


補足

クライアント側のコードを書くのがめんどくさい場合は、firebase/firebaseui-web が使える。デモサイト がある。

無料枠: https://firebase.google.com/pricing/ つまりは無制限ってことでいいのかな。