0
0

More than 1 year has passed since last update.

Firebase Authのカスタムクレームをターミナルから簡易に設定する

Posted at

サービスの管理者でも、全権限がある人や、アルバイトで一時的に入った人など、細かく権限を設定したいものです。
Firebase Authのカスタムクレームという機能を使えば、細かい権限設定が行えます。

しかし、その登録はAdmin SDKを介するので、NodeのRepl環境で行うのは、認証情報の初期化がややこしいです。

個人的にかなりつまづいたので、共有させていただきます。

localのfunctionsディレクトリでNodeを起動

まず、ターミナルでfunctions/のディレクトリに移動してNode Replを起動します。

cd XXX/functions/
node

サービスアカウントの秘密鍵を作成

  1. Firebase Consoleのプロジェクトの設定に移動する

  1. サービスアカウント のタブを開く

  1. 秘密鍵を生成してダウンロードして、保存したパスをコピーしておく

スクリーンショット 2021-10-25 12.35.47.png

サービスアカウントの秘密鍵のパスを環境変数に設定

export GOOGLE_APPLICATION_CREDENTIALS='PRIVATE_KEY_PASS'

これにて、自動でAdmin SDKが認証情報を取り扱ってくれます。
公式ドキュメントによると、これ以外の方法である認証情報をハードコードすることは推奨されていません。

Admin SDKが正しく初期化できることを確認する

NodeのReplへの入力
const admin = require('firebase-admin');
admin.initializeApp();

カスタムクレームが既に存在するか確認

該当ユーザにカスタムクレームが既に追加されているか確認しましょう。
これは、Admin SDKから行えるカスタムクレームへの操作が、既存のカスタムクレームに対する上書き操作であるからです。

NodeのReplへの入力
const uid = 'XXXXXXXX';
auth.getUser(uid).then((res,rej)=>{console.log(res.customClaims)});

このconsole出力がundefinedなら、該当ユーザに対するカスタムクレームは追加されていないことを示します。

一方で、以下のようなオブジェクトが出力される場合は、カスタムクレームが既に存在するので、値を追加する場合は、既にある存在を保持しつつ値を使いするように注意する必要があります。

console出力
{ role: { tempStaff: true } }

ですので、これらの既にあるkey,valueのペアを保存し統合された値を上書きするということをお勧めします。

疑似コード
let savedCustomClaimObject = { role: { tempStaff: true } };
savedCustomClaimObject.newKey = newValue;
admin.auth().setCustomUserClaims(uid, savedCustomClaimObject)

トラブルシューティング based on my failures

Error: Cannot find module 'firebase-admin'


Error: Cannot find module 'firebase-admin'
Require stack:
- <repl>
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:794:15)
    at Function.Module._load (internal/modules/cjs/loader.js:687:27)
    at Module.require (internal/modules/cjs/loader.js:849:19)
    at require (internal/modules/cjs/helpers.js:74:18) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [ '<repl>' ]

解決策: ディレクトリを確認

ローカルのfunctionsのディレクトリに移動してることを確認しましょう。このディレクトリでnode起動する必要があります。

Error: Failed to determine project ID


> (node:6503) UnhandledPromiseRejectionWarning:
Error: Failed to determine project ID: 
Error while making request: getaddrinfo ENOTFOUND metadata.google.internal.
Error code: ENOTFOUND
    at FirebaseAppError.FirebaseError [as constructor] 
...

解決策:秘密鍵の環境変数を再確認しよう

これが全てとは限りませんが、再度export GOOGLE_APPLICATION_CREDENTIALS ... の操作を実行しましょう。環境変数は現在のシェルのセッションのみで有効なので、違うターミナルウィンドウ開いた時は、再度環境変数を入れる必要があるので要注意です。

References

公式ドキュメントしか勝たん

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0