前提条件
- 事前に「firebase-tools」のインストールや、ログインが必要です。
- 事前にfirebaseでプロジェクトを作成していること。
- 該当プロジェクトがBlazプランに変更されていること。(Sparkプランではだめ)
- Hasuraを構築しておきましょう。
Cloud Function
料金制度、プラン
プロジェクトごとにプランを設定できます。いつでも簡単に戻せるので学習のために使っている場合は学習後はすぐにSparkに戻しておくと良いでしょう。
プラン
Spark
無料プランです。
Blaze
従量制の有料プランです。
Cloud Functionの構築
1 |
firebase init |
Which Firebase features do you want to set up for this directory? Press Space to select features, then Enter to confirm your choices.
「Functions: Configure a Cloud Functions directory and its files」を選択する。
Please select an option:
「Use an existing project」を選択する。
Select a default Firebase project for this directory:
firebaseで作ったプロジェクトを選択します。
What language would you like to use to write Cloud Functions?
JS or TSプロジェクトで使っている方を選びましょう。
Do you want to use ESLint to catch probable bugs and enforce style?
ESLintを適用する場合はyを選びます。試すだけなら切っておいた方が無難です。(よくわからないエラーが出る場合があるので)
Do you want to install dependencies with npm now?
dependenciesをインストールするならyで問題ないです。
作業ディレクトリにfunctionsというフォルダが作成されています。
Hasuraとの連携
ディレクトリ移動
1 |
cd functions |
Hasuraとの連携
1 |
firebase functions:config:set hasura.url="HasuraのエンドポイントURL" hasura.admin_secret="Hasuraのadminシークレット" |
index.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import * as functions from 'firebase-functions' import * as admin from 'firebase-admin' admin.initializeApp() export const setCustomClaims = functions.auth.user().onCreate(async (user) => { const customClaims = { 'https://hasura.io/jwt/claims': { 'x-hasura-default-role': 'hasuraで定義したロール名', 'x-hasura-allowed-roles': ['hasuraで定義したロール名'], 'x-hasura-user-id': user.uid, }, } try { await admin.auth().setCustomUserClaims(user.uid, customClaims) await admin.firestore().collection('user_meta').doc(user.uid).create({ refreshTime: admin.firestore.FieldValue.serverTimestamp(), }) } catch (e) { console.log(e) } }) |
Hasuraへのリクエストヘッダー(customClaims)
x-hasura-default-role
Hasuraにリクエストする際のデフォルトのロール、プログラム内で上書きもできます。
x-hasura-allowed-roles
存在するロールの一覧を配列で指定します。使いたいロールは全て追記しましょう。
x-hasura-user-id
ログインしているユーザーIDを指定します。firebaseと連携する場合は、firebaseのユーザーIDなどを指定すると良いでしょう。Hasuraのpermissionsの機能と組み合わせれば、特定のユーザーで登録したものをそのユーザーでしか閲覧できないというような実装を簡単に行うことができます。
admin.auth().setCustomUserClaims
firebaseにcustomClaims付きでユーザー登録します。なお、customClaimsの反映には少しラグがあります。
await admin.firestore().collection('user_meta').doc(user.uid).create({ xxx })
firebaseのfirestoreにユーザーのメタ情報を書き込んでいます。customClaimsの反映にラグがあるのでそれが終わったことを実装するアプリケーションに別途通知する必要があるためです。コレクションの名前としてuser_metaという名前で生成しています。
refreshTime: admin.firestore.FieldValue.serverTimestamp(),
refreshTimeというフィールドをfirestoreに作って、サーバー時間を格納しています。
Cloud Functionsのデプロイ
1 |
firebase deploy --only functions |
表示されたURLにアクセスしたら無事サイトを閲覧することができます。
この記事へのコメントはありません。