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

时间:2016-07-13 16:52:57

标签: firebase firebase-realtime-database firebase-authentication

我使用firebase.auth()。signInWithEmailAndPassword创建了一些用户,并希望立即停止signUp,但保持signIn工作。我尝试了一些关于用户的规则,甚至根本不再写入firebase。但是仍然可以进行注册。在控制台中禁用电子邮件/密码也会禁用登录。

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

如何在Firebase 3中向用户应用安全规则?

5 个答案:

答案 0 :(得分:29)

Firebase明确将身份验证(登录到应用)与授权分开(从应用访问数据库或存储资源)。

如果不禁用所有用户的登录功能,则无法禁用注册,这不是您想要的。

在典型情况下,开发人员将根据经过身份验证的用户开始保护数据库/文件访问。请参阅database securitystorage security的文档中的相关部分。

如果您的用例是您只希望特定用户拥有访问权限,那么您可能希望实施白名单:允许访问数据的用户列表。

您可以在安全规则中执行此操作:

"angular-resource": "^1.4.0",

或者(更好)将允许的uid列表放在数据库中并引用安全规则中的那个:

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

然后:

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

答案 1 :(得分:6)

问了问题已经有好几天了,但是也许这对那些仍想知道答案的人有所帮助,我们仍然不能简单地禁用新帐户的创建,但是我们可以使用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 Web控制台或第三方创建用户时,会触发此功能。 因此,您必须创建,等待功能,然后启用用户。

答案 2 :(得分:1)

如果您要从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);
}

答案 3 :(得分:0)

如上所述,区分身份验证和授权很重要。因此,这也可以稍微脱离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函数。它们都应该在加载页面之前运行

答案 4 :(得分:0)

我使用这个:

// 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))
        })
    });
});