Firebase を使うとサーバ側のコードを書かなくても色々な事が出来るが、機能が足りない時に Cloud Functions というのを使ってちょっとした処理を行う事が出来る。試しに Firebase Admin API を使って JSON Web Token を発行してみた。
事前準備: 秘密鍵の発行
Cloud Functions だけなら必須ではないが、Firebase Admin API を使うために秘密鍵を発行する。
- Firebase Console > Settings (歯車) > SERVICE ACCOUNTS
- Generate New Private Key
- Private Key がダウンロードされるので serviceAccountKey.json という名前で保存する。
環境のセットアップ
Cloud Functions にも firebase-tools が必要なので確認。
npm install -g firebase-tools
現在のディレクトリに Cloud Functions プロジェクトを作る。
firebase init functions
すでに現在のディレクトリで Firebase hosting を使っている場合は firebase.json
に Cloud Functions の設定を追加してくれる。上書きで消される事は無い。言語として TypeScript を選ぶと適当に TypeScript 環境を設定してくれる。プログラムは functions/src/index.ts に関数を書く。
JSON Web Token を発行する例
とりあえず何も考えず発行する。../config/serviceAccountKey.json に秘密鍵が置いてあること前提。
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
const serviceAccount = require('../config/serviceAccountKey.json');
admin.initializeApp({
// ...functions.config().firebase,
credential: admin.credential.cert(serviceAccount),
});
let serial = 0;
export const getToken = functions.https.onRequest((req, res) => {
serial++;
const uid = `user-${serial}`;
admin.auth().createCustomToken(uid, {})
.then((token: string) => {
console.log(token)
res.send(token);
})
.catch((error: any) => {
console.log("Error creating custom token:", error);
});
});
テスト実行
cd functions
npm run build
firebase serve --only functions
これで http://localhost:5000/physeter-idpoc/us-central1/getToken あたりにアクセスすると動作確認出来る。
hosting と functions 同時にローカルでテストしたい場合は
firebase serve --only functions,hosting
のようにすると良い。localhost に functions hosting それぞれ別のポートでサービスが立ち上がり便利。
注意点としては、以前に Firebase hosting を firebase serve
でテストした事がある場合、http://localhost:5000 にアクセスして Crtl + Reload でキャッシュをクリアする必要があった。キャッシュをクリアしないと古いコンテンツが見えてしまう。
デプロイ
firebase deploy --only functions
ここで表示された URL にアクセスすると結果が表示される。
コツ
functions/tsconfig.json に 以下のような typeRoots を入れないと親ディレクトリまで参照して面倒な事になる。-> ややこしいので hosting と functions は完全に分けるべきか。
"compilerOptions": {
...
"typeRoots": ["./node_modules/@types"]
...
}
参考