Open29
Firebase
Googleアカウントを切り替える
firebase login --reauth
あとからCloud Functionsをプロジェクトに追加する
firebase init functions
functionsだけdeployする
firebase deploy --only functions
firebase.json
にこういう記述があるので firebase deploy
するとlintとbuildが実行されているらしい
firebase.json
% cat firebase.json
{
"functions": {
"predeploy": [
"npm --prefix \"$RESOURCE_DIR\" run lint",
"npm --prefix \"$RESOURCE_DIR\" run build"
]
}
}
functionの記述例
index.ts
export const helloWorld = functions.https.onRequest((request, response) => {
functions.logger.info("Hello logs!", {structuredData: true});
response.send("Hello from Firebase!");
});
export const helloWorld2 = functions.https.onRequest((request, response) => {
functions.logger.info("Hello2 logs!", {structuredData: true});
response.send("Hello2 from Firebase!");
});
firebase auth
のユーザ作成時と削除時に関数を実行、関数からfirestore
へのアクセスを行う
index.ts
import * as functions from "firebase-functions";
import * as admin from "firebase-admin";
admin.initializeApp();
exports.onCreateUser = functions.auth.user().onCreate((user) => {
const uid = user.uid;
const email = user.email;
const displayName = user.displayName;
const newUser = {
uid: uid,
email: email,
displayName: displayName,
};
return admin.firestore().collection("users").doc(uid).set(newUser);
});
exports.onDeleteUser = functions.auth.user().onDelete((user) => {
const uid = user.uid;
return admin.firestore().collection("users").doc(uid).delete();
});
jestを使ったfirebase.rulesのテスト環境の構築手順
-
jest
のインストールnpm install -j jest
-
初期化
jest --init
- firebase/rules-unit-testing を追加
npm i -D @firebase/rules-unit-testing
-
テストコード
-
firestore.rules.test.js
などを作成
-
-
テスト実行
firebase emulators:exec --only firestore "jest --detectOpenHandles"
- firestore.rules のテストを実行
firebase emulators:exec --only firestore "jest --detectOpenHandles"
- firestore のルールだけデプロイする
firebase deploy --only firestore
- cloud storage の rule
- ruleのデプロイ
firebase deploy --only storage
- homebrew でnodeをインストールすると v15 になる
- node が v15 だとfunctionsのビルドに失敗する
- 以下の記事を参考に古いバージョンを(グローバルではなく)プロジェクトに追加した
- homebrew で node の特定バージョンをインストールする方法
バケット単位でオブジェクトを公開する方法
-
Cloud Storage for Firebase のpublic urlはtokenベースの検証をするのでアクセスが遅い
-
URLを取得するためにgetDownloadURL()が必要
-
GCPのCloud Storageのパブリックアクセスを利用すると速くなる
-
アクセス制御がいらないコンテンツで使う
Cloud Functions のリージョン一覧
Storage が無駄に容量を食っている時に確認すること
storage の bucket を指定してruleをデプロイする
iOS SDKでCloud Storage for Firebaseのバケットを指定する方法
// Get a non-default Storage bucket
storage = Storage.storage(url:"gs://my-custom-bucket")
複数のbucketに個別のruleファイルを適用する
- デプロイターゲットの管理
JS v9版のAPIリファレンス
API Reference | Firebase
GitHub ActionsでHostingにデプロイする手順
firestoreを型安全に使う
認証状態を取得する
firestore default rule
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// This rule allows anyone with your Firestore database reference to view, edit,
// and delete all data in your Firestore database. It is useful for getting
// started, but it is configured to expire after 30 days because it
// leaves your app open to attackers. At that time, all client
// requests to your Firestore database will be denied.
//
// Make sure to write security rules for your app before that time, or else
// all client requests to your Firestore database will be denied until you Update
// your rules
match /{document=**} {
allow read, write: if request.time < timestamp.date(2023, 10, 14);
}
}
}
firestore.rulesでアクセスできるfield