web-dev-qa-db-ja.com

Firebase 3.xでサインアップを無効にする方法

Firebase.auth()。signInWithEmailAndPasswordを使用して一部のユーザーを作成しましたが、今すぐsignUpを停止し、signInは引き続き機能させたいと考えています。私はユーザーに対していくつかのルールを試しましたが、firebaseへの書き込みをまったく停止しました。しかし、登録はまだ可能でした。コンソール内で電子メール/パスワードを無効にすると、ログインも無効になります。

{
  "rules": {
        ".read": true,
        ".write": false,
      }
}

Firebase 3のユーザーにセキュリティルールを適用する方法はありますか?

19
ZimZim

Firebaseは、認証(アプリへのサインイン)を承認(アプリからデータベースまたはストレージリソースへのアクセス)から明示的に分離します。

すべてのユーザーのサインインを無効にすることなくサインアップを無効にすることはできませんが、これは望ましくありません。

典型的なシナリオでは、開発者は認証されたユーザーに基づいてデータベース/ファイルアクセスの保護を開始します。 データベースセキュリティ および ストレージセキュリティ については、ドキュメントの関連セクションを参照してください。

特定のユーザーだけがアクセスできるようにする場合は、ホワイトリスト、つまりデータへのアクセスを許可されているユーザーのリストを実装する必要があるでしょう。

あなたはあなたのセキュリティルールでそれをすることができます:

{
  "rules": {
        ".read": "auth.uid == '123abc' || auth.uid == 'def456'",
        ".write": false,
      }
}

または(より良い)許可されたuidのリストをデータベースに入れ、セキュリティルールからそれを参照することによって:

"allowedUids": {
    "123abc": true,
    "def456": true
}

その後:

{
  "rules": {
        ".read": "root.child('allowedUids').child(auth.uid).exists()",
        ".write": false,
      }
}
38

質問が投稿されてから数日が経過しましたが、これがまだ答えを知りたくない人のために役立つ可能性があります。新しいアカウントの作成を無効にすることはできませんが、Firebase関数を使用して行うことができます。

これは、クラウド機能を使用して新しいユーザーを自動的に無効にするための回避策です。

const admin = require('firebase-admin');

exports.blockSignup = functions.auth.user().onCreate(event => {
  return admin.auth()
    .updateUser(event.uid, {disabled: true})
    .then(userRecord => console.log(`Auto blocked user: ${userRecord.toJSON()}`))
    .catch(error => console.log(`Error auto blocking: ${error}`));
});

この関数は、Firebaseウェブコンソールを使用してユーザーを作成するとき、またはサードパーティによって起動されることに注意してください。したがって、関数を作成して待機し、ユーザーを有効にする必要があります。

17
Muhammad Ovi

AndroidアプリのFirebaseUIからサインアップオプションを削除する場合は、次のプロバイダーを追加する必要があります。

new AuthUI.IdpConfig.EmailBuilder().setAllowNewAccounts(false).build());

関数は次のようになります。

private void FireBaseLoginUI() {
        List<AuthUI.IdpConfig> providers = Arrays.asList(
                new AuthUI.IdpConfig.EmailBuilder().build(),
                new AuthUI.IdpConfig.EmailBuilder().setAllowNewAccounts(false).build());

        startActivityForResult(
                AuthUI.getInstance()
                        .createSignInIntentBuilder()
                        .setAvailableProviders(providers)
                        .setLogo(R.drawable.app_logo)
                        .setTheme(R.style.AuthUITheme)
                        .build(),
                RC_SIGN_IN);
}

上記のように、認証と承認を区別することが重要です。したがって、これはFirebaseからわずかに外して行うこともできます。たとえば、Webアプリを構築していて、特定のユーザーリストへの特定のページへのアクセスを許可する場合は、Webアプリ内で処理できます。

この例は、onCall firebase関数を実行するためのものです。ユーザーUIDが12345の場合にのみ実行されます

exports.ILoveConsole = functions.https.onCall((message, context) => {

//message is just a text
//context hold the user auth information

    'use strict';
        if (context && context.auth && context.auth.uid) {
            if(context.auth.uid === "12345"){
                console.log("I love security");
            }
            else{
                console.log("You are authenticated but not authorized");
            }
        }
        else {
            console.log("You are neither authenticated nor authorized");
        }
});

注:ユーザーのリストを作成する場合は、forループ関数を実行して、承認されたユーザーの配列をブラウザーで確認するか、firebase関数を呼び出します。どちらもページをロードする前に実行する必要があります

0
s.khetcho