Web から Firestore を使うと、アクセスキーが開発ツールから丸見えになってしまうのが不安。いやまぁ、ちゃんとアクセスルールを設定すれば問題ないんだろうけど、自分の Firestore スキルはまだそこまでではない。うっかり設定し忘れもあり得る。
いっそ、Cloud Functions for Firebase で Web API を実装し、その中から Firestore にアクセスすれば、アクセスキーを覗かれずに済むんじゃないか?というわけでやってみた。
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
import * as express from 'express';
const serviceAccount: admin.ServiceAccount = {
"projectId": "FIrebase プロジェクト ID",
"privateKey": "サービスアカウントに発行したアクセスキーの JSON の privateKey",
"clientEmail": "サービスアカウントに発行したアクセスキーの JSON の clientEmail",
};
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
});
const db = admin.firestore();
const app = express();
app.get('/items', async (req, res) => {
const snapshot = await db.collection('items')
.orderBy('createdAt', 'desc')
.get();
const items = [];
snapshot.forEach((doc) => {
const item = doc.data();
items.push(item);
});
res.writeHead(200, {
'Content-Type': 'application/json',
});
res.send(JSON.stringify(items));
});
app.get('/items/:id', async (req, res) => {
const id = req.param('id');
const doc = await db.collection('items')
.doc(id)
.get();
if (doc.exists) {
const item = doc.data();
res.writeHead(200, {
'Content-Type': 'application/json',
});
res.send(JSON.stringify(item));
} else {
res.status(404);
}
});
export const api = functions.https.onRequest(app);
せっかく Firestore 使っているのに、Cloud Functions for Firebase を使って Web API を実装するというのは本末転倒ではあるけど、Firestore を使いこなせるようになるまでの繋ぎってことで。