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