firebase webで別プロジェクトのAuthenticationを流用する


概要

firebase authを使ってログインしたとき、同時に別のプロジェクトにも「同じユーザーとして」ログインし、1つのプロジェクトから他のプロジェクトたちにユーザー情報を共有する方法の解説です。

できることとして、「firestore rulesを書くとき、別プロジェクトのAuthenticationに基づいたconditionを書くことができる」などがあります。
つまり、認証用にメインのプロジェクトを用意し、firestoreは用途別のプロジェクトに分散する、といったことが可能になります。

手順

以下の2つのプロジェクトを考えます。

  • 「親PJ」: 認証用。ユーザー情報のマスターとなる
  • 「子PJ」: プロジェクトAのユーザー情報を継承する。

両プロジェクトで以下のことが済んでいるとします。

  • Authenticationが有効化
  • Web appの追加 ( firebaseConfig の取得 )

1. 親PJのOAuth 2.0 Client IDの取得

https://console.cloud.google.com/apis/credentials を開き、親PJを選択した上で、 "Web client"のClient IDをコピーしておきます。

2. 子PJで親PJを信頼する

子PJの設定で、「Authentication > Sign-in method」からGoogleログインを有効化します。
Googleログインの設定項目に「Safelist client IDs from external projects (optional)」があるので、ここにさきほどのClient IDを追加します。

3. Webで親PJと同時に子PJにもログインできるよう実装する

まず通常通り親PJにログインし、その際に返却される認証情報をそのまま用いて、さらに子PJへのログインを行います。
ここでは親PJにGoogleログインを行っています。

firebase.initializeApp(firebaseConfigPrimary)
firebase.initializeApp(firebaseConfigSecondary, 'secondary')

// Sign in to primary project
const provider = new firebase.auth.GoogleAuthProvider()
const signInResult = await firebase.auth().signInWithPopup(provider)

// Sign in to secondary project
const credential = signInResult.credential
await firebase.app('secondary').auth().signInWithCredential(credential)

これによって親PJから子PJに認証情報が継承され、一度のユーザー操作でで両プロジェクトへのログインができるようになります。

感想

PJからPJの信頼まわりでの情報がほとんどなく苦労しました...
これでDBが分割できるので嬉しいですね。

参考