簡體   English   中英

如何在 Firebase 3.x 中禁用注冊

[英]How to disable Signup in Firebase 3.x

我已經使用 firebase.auth().signInWithEmailAndPassword 創建了一些用戶,現在想停止注冊,但保持登錄工作。 我嘗試了一些用戶規則,甚至完全停止寫入 firebase。 但是仍然可以注冊。 在控制台中禁用電子郵件/密碼也會禁用登錄。

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

任何想法如何將安全規則應用於 Firebase 3 中的用戶?

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,
      }
}

好吧,這個問題已經有好幾天了,但也許這對那些仍然想知道答案的人有幫助,我們仍然不能簡單地禁用新帳戶創建,但我們可以使用 Firebase 函數:

這是使用雲功能自動禁用新用戶的解決方法。

const functions = require('firebase-functions');
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 網絡控制台或由 3rd 方創建用戶時,會觸發此函數。 所以你必須創建,等待函數,然后啟用用戶。

如果您想從 Android 應用程序的FirebaseUI中刪除注冊選項,則必須添加以下提供程序:

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

該函數將如下所示:

private void FireBaseLoginUI() {
        List<AuthUI.IdpConfig> providers = Collections.singletonList(
                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);
}

我用這個:

// The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers.
const functions = require('firebase-functions');
const admin = require("firebase-admin");

admin.initializeApp();

exports.blockSignup = functions.auth.user().onCreate(event => {
    if (process.env['allowCreation'] === "false")
        return admin.auth().deleteUser(event.uid);
    else return Promise.resolve("letUserCreate");
});

創建我想要的用戶后,轉到https://console.cloud.google.com/functions並將環境變量更改為 false,重新部署,完成。

或者,您可以將用戶添加到 firestore,並且僅當用戶存在於 firestore 時才允許注冊。 像這樣:

// The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers.
const functions = require('firebase-functions');
const admin = require("firebase-admin");

admin.initializeApp();

exports.blockSignup = functions.auth.user().onCreate(user => {
    return new Promise((resolve, reject) => {
        admin.firestore().collection('users').doc(user.email).get().then(doc => {
            if (doc.exists) {
                resolve("letUserCreate");
            }
            else {
                reject(admin.auth().deleteUser(user.uid))
            }
        }).catch(reason => {
            console.error(reason)
            reject(admin.auth().deleteUser(user.uid))
        })
    });
});

如果您啟用Cloud Identity API,則可以禁用用戶的注冊和刪除帳戶操作,並將其限制為Admin SDK

在此處輸入圖片說明

您可以訪問https://console.cloud.google.com/customer-identity/settings來禁用它們。

在現有項目上啟用 API 時,您可能會收到此通知:

在此處輸入圖片說明

禁用后,使用createUserWithEmailAndPassword方法返回 400 錯誤:

{
  "error": {
    "code": 400,
    "message": "ADMIN_ONLY_OPERATION",
    "errors": [
      {
        "message": "ADMIN_ONLY_OPERATION",
        "domain": "global",
        "reason": "invalid"
      }
    ]
  }
}

請注意,您仍然可以使用 Admin SDK 創建新用戶。

可以在此處找到相同的文檔

如上所述,區分身份驗證和授權很重要。 因此,這也可以在 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 函數。 他們都應該在加載頁面之前運行

我不知道 Google 是否在發布其他答案后添加了此選項,或者它是否隱藏在大多數人不知道的文檔中,但 FirebaseUI Auth 有一個disableSignup選項。 https://github.com/firebase/firebaseui-web/blob/master/README.md#configure-email-provider

用法如下所示:

var uiConfig = {
    callbacks: {
        signInSuccessWithAuthResult: (authResult, redirectUrl) => {
            // User successfully signed in.
            // Call your success handler.
            handleLoginSuccess(authResult.user)
            .then( () => {
                return true;
            })
            .catch( err => {
                return false;
            });
        },
        signInFailure: (err) => {
            console.error(`[signInFailure] ERROR: ${err.message}`);
        },
        uiShown: () => {
            // The widget is rendered.
            // Hide the loader.
            document.getElementById('loader').style.display = 'none';
        }
    },
    signInSuccessUrl: "/",
    signInOptions: [
        {
            provider: firebase.auth.EmailAuthProvider.PROVIDER_ID,
            requireDisplayName: true,
            disableSignUp: {
                status: true,
                adminEmail: 'help@example.com',
                helpLink: 'https://example.com/login-help'
            }
        }
    ]
};

ui.start("#firebaseui-auth-container", uiConfig);

希望這對最終來到這里的未來搜索者有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM