Closed fujiokayu closed 3 years ago
アカウント作成時に Administrator の Custom claim の設定も必要だし、専用の Cloud Functions for Firebase の関数を実装することにした。
サービスアカウントキーの連携は公式で勧められている GOOGLE_APPLICATION_CREDENTIALS を採用する。 デプロイ時に注意。
firebase.auth().currentUser.emailVerified
で email アドレスが確認済みかどうかの真正性検証を導入し、確認されていない場合は firebase.auth().currentUser.sendEmailVerification()
を実行して確認メールを送信してからサインアウトするように 79f95fcf09e414bf5cba5519e0ca3feb3c6dccab で実装した。
クライアントサイドのコードだから firebase.auth().currentUser.emailVerified
がバイパスされる懸念はある。
意志表示としての禁止は示しているし、他の処理でセキュリティの担保はできてそうなのでクローズにする。 実装自体は Firebase のベストプラクティスのはず。
招待した人にしか Sign up を許容しないというロジックを実装したかったが、Sign up と Sign in を切り離して実装することは現状の Firebaseui-web では実現できない。 firebaseui-web のリポジトリの Issue #99 でも Feature request として挙げられており、この Issue ではさまざまな W/A が議論されている。 index.tsx で登録されているユーザーのみを Sign up ページに飛ばす制御もできるが、その制御だと簡単に Bypass、不正 Sign up が可能。
現時点でサーバーレスな関数は Vercel の API Routes を使用しているが、Cloud Functions の functions.auth.user().onCreate トリガーを使った Sign in 検知のロジックと Custom Claim を組み合わせるのが最適解のように思えるが、実装タスクとしてやや重いし、一つだけ Cloud Functions を用意するのもデプロイが面倒。