1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Python】Firebaseでテナントごとにユーザー管理ができるよ

Last updated at Posted at 2023-05-22

Firebaseでユーザーをテナント(店舗)ごとに管理できるよ

テナント(店舗)単位でユーザーをユニークに管理する際にとっても便利
Firebase的にはマルチテナンシーって言うらしい
以下のイメージ

店舗名 ユーザーID なまえ
A店 1 スーパーたろうさん
A店 2 タコライス君
B店 3 スーパーたろうさん

今回はフロント用のWeb SDKと管理用のAdmin SDKの使い方をまとめるよ
とりあえずGoogle Cloudでマルチテナンシーを有効にする必要があるよ
公式ドキュメントは↓
https://cloud.google.com/identity-platform/docs/multi-tenancy-quickstart?hl=ja
導入も簡単だから管理サイトのユーザー認証をFirebaseに丸投げできるね

フロント側の実装(Web SDK バージョン9)

基本的にgetAuth後にtenantIdを指定するだけでマルチテナンシーを使わない場合とあまり変わらないよ

javascript
import {
    initializeApp,
    getAuth
} from "firebase/app";

const firebaseConfig = {
    apiKey: "XXXXX",
    authDomain: "XXXXX.firebaseapp.com",
    projectId: "XXXXX",
    storageBucket: "XXXXX",
    messagingSenderId: "XXXXX",
    appId: "XXXXX"
};
const firebaseApp = initializeApp(firebaseConfig);
const auth = getAuth();
// テナント1を使用
auth.tenantId = "TENANT_ID1";
// テナント2へ切り替え
auth.tenantId = "TENANT_ID2";

ログイン関係

既にauthにテナント情報が入っているのでテナントは意識しなくてOK

javascript
import {
    initializeApp,
    getAuth,
    signInWithEmailAndPassword,
    GoogleAuthProvider,
    OAuthProvider,
    signInWithPopup
} from "firebase/app";

// メールパスワードログイン
signInWithEmailAndPassword(auth, email, password)
.then((result) => { const user = result.user; })
.catch((error) => { console.log("faild to login", error.code, error.message); });

// googleログイン
var provider_google = new GoogleAuthProvider();
signInWithPopup(auth, provider_google)
.then((result) => { const user = result.user; })
.catch((error) => { console.log("faild to login", error.code, error.message); });

// appleログイン
var provider_apple = new OAuthProvider("apple.com");
signInWithPopup(auth, provider_apple)
.then((result) => { const user = result.user; })
.catch((error) => { console.log("faild to login", error.code, error.message); });

サーバーサイドの実装

今回はpythonでAdmin SDKを使っていくよ
テナントの作成からユーザーの操作ができるぜ

テナント関係の操作

python
import firebase_admin
from firebase_admin import credentials
from firebase_admin import tenant_mgt

# テナントの作成
tenant = tenant_mgt.create_tenant(
    display_name="てなんと1",
    allow_password_sign_up=True
)
print(f"Created tenant: {tenant.tenant_id}")

# テナントの更新
tenant = tenant_mgt.update_tenant(
    tenant_id,
    display_name="てなんと1・改",
    allow_password_sign_up=False
)
print(f"Updated tenant: {tenant.tenant_id}")

ユーザー関係の操作

python
cred = credentials.Certificate("./serviceAccountKey.json")
if not firebase_admin._apps:
    firebase_admin.initialize_app(cred)
tenant_client = tenant_mgt.auth_for_tenant('TestTenant1-4ygtb')

# ユーザー作成
user = tenant_client.create_user(
    email='user1@example.com',
    email_verified=False,
    phone_number='+819011111111',
    password='ぱすわーど',
    display_name='なまえ',
    photo_url='http://www.example.com/12345678/photo.png',
    disabled=False)

# トークン確認
decoded_firebase_token = tenant_client.verify_id_token(idToken)
uid = decoded_firebase_token["uid"]

# ユーザー情報更新
tenant_client.update_user(
    uid,
    email='user2@example.com',
    phone_number='+819011111111',
    email_verified=True,
    password='あたらしいぱすわーど',
    display_name='あたらしいなまえ',
    photo_url='http://www.example.com/12345678/photo.png',
    disabled=True
)

# ユーザー削除
auth.delete_user(uid)

最後に

Firebase全然知らんけどめっちゃ便利ね

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?