fujiokayu / S4

simple serverless secure storage
MIT License
1 stars 0 forks source link

Needs invitation code for authorize #6

Closed fujiokayu closed 3 years ago

fujiokayu commented 3 years ago

招待した人にしか 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 を用意するのもデプロイが面倒。

fujiokayu commented 3 years ago

アカウント作成時に Administrator の Custom claim の設定も必要だし、専用の Cloud Functions for Firebase の関数を実装することにした。

fujiokayu commented 3 years ago

サービスアカウントキーの連携は公式で勧められている GOOGLE_APPLICATION_CREDENTIALS を採用する。 デプロイ時に注意。

fujiokayu commented 3 years ago

firebase.auth().currentUser.emailVerified で email アドレスが確認済みかどうかの真正性検証を導入し、確認されていない場合は firebase.auth().currentUser.sendEmailVerification() を実行して確認メールを送信してからサインアウトするように 79f95fcf09e414bf5cba5519e0ca3feb3c6dccab で実装した。

クライアントサイドのコードだから firebase.auth().currentUser.emailVerified がバイパスされる懸念はある。

fujiokayu commented 3 years ago

意志表示としての禁止は示しているし、他の処理でセキュリティの担保はできてそうなのでクローズにする。 実装自体は Firebase のベストプラクティスのはず。