JavaScript
Node.js
Firebase

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

無料で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/ つまりは無制限ってことでいいのかな。