Set Auth claims with FirestoreというFirebase Extensionsを使ってClaimsの設定を行う方法

公開:2021/01/28
更新:2021/02/11
4 min読了の目安(約4200字TECH技術記事

こんにちは。もぐめっとです。

横から失礼します。

朝起きたらこんな記事が投稿されてました。
Firebase Experimental Extensions

どうやらexperimental-extensionsというリポジトリが公開されてそこから今後新しく入るfirebase extensionsを使えるようです。

2021/01/28現在、公開されているのは以下の五つです。

Set Auth claims with Firestore
Schedule Firestore writes
Sentiment analysis
Shorten URLs with Dynamic Links
Image text extraction

基本的には各リポジトリにインストールボタンがあって、ボタンを押してインストールするか、CLIからインストールすることが可能です。
今回はそのうち、Set Auth claims with Firestoreを解説します。

Set Auth claims with Firestore

firestoreにデータを書き込むとauthenticationにcalimsを書き込んでくれます!
今までこの辺は手動で作っていたのですがこれのおかげでその仕組みを作らなくて済むので少し楽になりました。

リポジトリから「Install on Firebase」ボタンを押下します。

試験運用なのを把握した上で使います。

次へ

braze以上にしておきましょう。

次へ

下記設定をして「拡張機能をインストール」を押下
「Claims Collection」:どういったcollectionにレコードが追加されたら動かすか
「Claims Field (Optional)」:これを指定すると指定したフィールドがclamsとして追加されます。空白だと全フィールドが対象になるので、基本は空白でいいと思います。(別途createdAtをつけたいとかの時に使える機能かと思われる)
「Cloud Functions location」:日本人なんでTokyoにしときましょう

インストールが終わるまでステンバーイ...結構かかります。

インストールの間にsecurity ruleを追加しておきましょう。

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /user_claims/{uid} {
      allow read: if request.auth.uid == uid || request.auth.token.role == 'admin';
      allow write: if request.auth.role == 'admin';
    }
  }
}

extensionができたら試しにデータを追加してみます。
今回はあらかじめFirebaseAuthenticationのコンソールからテストユーザを追加しておきました。
E1Du1akfusRYHG9yNqCYHgtwnEA3というUIDが得られたのでそのユーザを更新してみます。

db.collection("user_claims")
  .doc("E1Du1akfusRYHG9yNqCYHgtwnEA3")
  .set({
    role: "admin",
    groups: ["example1", "example2"],
  });

しばらくすると_syncedというフィールドが追加されました。どうやら無事にclaimsがついたようです。

コンソールからは確認できないのでコードを書いて確認してみます。

import admin from 'firebase-admin'
admin.initializeApp()
export const auth = admin.auth()

  ; (async () => {
    const user = await auth.getUser('E1Du1akfusRYHG9yNqCYHgtwnEA3')
    console.log(user.customClaims)
  })()

実行してみると

> tsc && node --experimental-modules --es-module-specifier-resolution=node ./dist/test.js

{ groups: [ 'example1', 'example2' ], role: 'admin' }

無事付与されてることがわかりました!

まとめ

ユーザごとに権限を付与するのにこのextensionを使うと簡単に権限が付与できます!
ただ、コンソールから簡単に変えられるようになったり見れるようになったりしたらより最高ですね!

[最後に宣伝]

こんなサービス作ってるのでよかったら使ってみてください!

ワンナイト人狼 for mobile
ワンナイト人狼オンライン(ガッツリfirebase使ってます。)
気軽に投稿できるフォトコンサイト - Camecon
連絡先を交換しなくてもグルチャができる - Offcha

この記事に贈られたバッジ