Firebase 踢出当前用户

IT技术 javascript firebase firebase-authentication
2021-01-30 09:07:28

所以我有这个问题,每次添加新用户帐户时,它都会踢出已经登录的当前用户。我阅读了 firebase api,它说“如果创建了新帐户,用户将自动登录“但他们从来没有说过要避免这种情况。

      //ADD EMPLOYEES
      addEmployees: function(formData){
        firebase.auth().createUserWithEmailAndPassword(formData.email, formData.password).then(function(data){
          console.log(data);
        });
      },

我是管理员,我正在向我的网站添加帐户。如果我可以在不注销并登录新帐户的情况下添加帐户,我希望它。有什么办法可以避免这种情况?

6个回答

更新 20161110 - 下面的原始答案

另外,请查看此答案以了解不同的方法。

原答案

这实际上是可能的。

但不是直接,这样做的方法是创建第二个身份验证引用并使用它来创建用户:

var config = {apiKey: "apiKey",
    authDomain: "projectId.firebaseapp.com",
    databaseURL: "https://databaseName.firebaseio.com"};
var secondaryApp = firebase.initializeApp(config, "Secondary");

secondaryApp.auth().createUserWithEmailAndPassword(em, pwd).then(function(firebaseUser) {
    console.log("User " + firebaseUser.uid + " created successfully!");
    //I don't know if the next statement is necessary 
    secondaryApp.auth().signOut();
});

如果您未指定用于操作的 Firebase 连接,它将默认使用第一个连接。

多个应用程序引用的来源

编辑

对于新用户的实际创建,除了管理员之外没有任何人或其他人都没有关系,在第二个身份验证引用上进行身份验证,因为创建帐户所需的只是身份验证引用本身。

以下尚未经过测试,但值得考虑

您必须考虑的是将数据写入 Firebase。通常的做法是用户可以编辑/更新他们自己的用户信息,因此当您使用第二个身份验证参考来编写时,这应该可以工作。但是,如果您拥有该用户的角色或权限之类的内容,请确保使用具有正确权限的 auth 引用编写这些内容。在这种情况下,主身份验证是管理员,第二身份验证是新创建的用户。

这真的帮了我很多,谢谢!要添加的一件事是我必须添加“secondaryApp.delete();” 阻止 firebase 告诉我有另一个应用程序在全球注册。
2021-03-14 09:07:28
@Jay True 和一个好点,但这实际上与创建新用户无关。任何人都可以创建用户。当我对此进行测试时,我可以创建多个用户。但是,您让我想到了其他可能成为问题的事情,即在创建该用户后将用户数据写入 Firebase。我会更新我的答案以包括我对此的想法。
2021-03-21 09:07:28
我在挖这个 但是,这是否仍然未对辅助应用程序帐户(或 mainAppAccount)进行身份验证,从而阻止创建另一个用户而无需重新进行身份验证?
2021-03-23 09:07:28
@AndréKool:我们刚刚发布了一个 firebase-admin SDK,无需使用您的(公认的聪明)解决方法。请参阅下面我更新的答案
2021-03-26 09:07:28
@FrankvanPuffelen 好吧,闭嘴。这是正确的(当然)。这就引出了这个问题;为什么要进行最初的更改?当任何人仍然可以创建帐户时,取消正在创建用户的已验证帐户的身份似乎有点违反直觉。奇怪的。无论如何,这是一个精彩的答案。
2021-04-09 09:07:28

更新 20161108 - 下面的原始答案

Firebase 刚刚发布了它的 firebase-admin SDK,它允许服务器端代码用于这个和其他常见的管理用例。阅读安装说明,然后深入了解有关创建用户文档

原答案

这是目前不可能的。创建电子邮件+密码用户会自动让该新用户登录。

Firebase Admin node.js SDK 应仅在受信任的环境中运行。在不登录的情况下创建用户被视为一项管理任务。
2021-03-12 09:07:28
@FrankvanPuffelen 你们有什么理由不添加noLogin标志createUserWithEmailAndPassword吗?像许多其他人一样,我也需要在不使用 Admin SDK 的情况下从我的前端添加用户。
2021-03-13 09:07:28
@FrankvanPuffelen 我希望移动应用程序用户能够邀请使用createUserWithEmailAndPassword并向用户发送电子邮件的用户。我不想在客户端/移动应用程序中使用 firebase-admin SDK。我还有哪些选择?
2021-03-19 09:07:28
好的,所以我只花了几个小时研究 Node.js,设置了一个服务来处理来自 angular2 项目的新用户表单的 Post 数据,登录用户不会被启动:)。现在来实现删除和更新。
2021-03-23 09:07:28
Frank ,所以如果我想在不登录的情况下创建用户,我应该在我的 AngularJS 应用程序中使用 Firebase 管理 SDK 吗?
2021-04-03 09:07:28

我刚刚创建了一个 Firebase 函数,它在创建 Firestore 文档时触发(规则只写给管理员用户)。然后使用 admin.auth().createUser() 正确创建新用户。

export const createUser = functions.firestore
.document('newUsers/{userId}')
.onCreate(async (snap, context) => {
    const userId = context.params.userId;
    const newUser = await admin.auth().createUser({
        disabled: false,
        displayName: snap.get('displayName'),
        email: snap.get('email'),
        password: snap.get('password'),
        phoneNumber: snap.get('phoneNumber')
    });
    // You can also store the new user in another collection with extra fields
    await admin.firestore().collection('users').doc(newUser.uid).set({
        uid: newUser.uid,
        email: newUser.email,
        name: newUser.displayName,
        phoneNumber: newUser.phoneNumber,
        otherfield: snap.get('otherfield'),
        anotherfield: snap.get('anotherfield')
    });
    // Delete the temp document
    return admin.firestore().collection('newUsers').doc(userId).delete();
});

您可以使用算法使用 functions.https.onCall()

exports.createUser= functions.https.onCall((data, context) => {
    const uid = context.auth.uid; // Authorize as you want
    // ... do the same logic as above
});

调用它。

const createUser = firebase.functions().httpsCallable('createUser');
createUser({userData: data}).then(result => {
    // success or error handling
});
我相信这是解决这个问题的唯一正确和好的解决方案!谢谢保罗。
2021-03-22 09:07:28

这是一个使用 Web SDK 的简单解决方案。

  1. 创建云函数 ( https://firebase.google.com/docs/functions )
import admin from 'firebase-admin';
import * as functions from 'firebase-functions';

const createUser = functions.https.onCall((data) => {
  return admin.auth().createUser(data)
    .catch((error) => {
      throw new functions.https.HttpsError('internal', error.message)
    });
});

export default createUser;
  1. 从您的应用调用此函数
import firebase from 'firebase/app';

const createUser = firebase.functions().httpsCallable('createUser');

createUser({ email, password })
  .then(console.log)
  .catch(console.error);
  1. 或者,您可以使用返回的 uid 设置用户文档信息。
createUser({ email, password })
  .then(({ data: user }) => {
    return database
      .collection('users')
      .doc(user.uid)
      .set({
        firstname,
        lastname,
        created: new Date(),
      });
  })
  .then(console.log)
  .catch(console.error);
这是我最喜欢的解决方案,但它被 CORS 阻止了?
2021-03-26 09:07:28
@Davtho1983 听起来您需要调整与此答案无关的云功能设置:cloud.google.com/functions/docs/writing/...
2021-03-27 09:07:28
Gud 解决方案将用户添加到身份验证部分而不是 firestore <3
2021-04-07 09:07:28

Swift 5:简单的解决方案

首先将当前用户存储在一个名为 originalUser 的变量中

let originalUser = Auth.auth().currentUser

然后,在创建新用户的完成处理程序中,使用updateCurrentUser方法恢复原用户

Auth.auth().updateCurrentUser(originalUser, completion: nil)
尽管登录用户的电子邮件中存在闪烁的行为,但我会保留此建议,我发现它更简单,更正确,也许我会在执行更新功能时做一些隐藏闪烁的事情
2021-03-14 09:07:28
绝妙的解决方案!
2021-04-07 09:07:28