[英]How to disallow disposable email in firebase auth email provider signup?
[英]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.