Firebase推出了当前用户

Vic*_* Le 48 javascript firebase firebase-authentication

所以我有这个问题,每当我添加一个新的用户帐户时,它就会启动已经登录的当前用户.我读了firebase api并且说" 如果新帐户已创建,则用户自动登录"但他们从未说过任何关于避免这种情况的事情.

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

我是管理员,我正在为我的网站添加帐户.如果我可以添加帐户而不退出并登录新帐户,我希望如此.我能避免这种情况吗?

And*_*ool 85

更新20161110 - 以下原始答案

另请查看此答案以获得不同的方法.

原始答案

这实际上是可能的.

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

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();
});
Run Code Online (Sandbox Code Playgroud)

如果未指定用于操作的firebase连接,则默认情况下将使用第一个连接.

多个应用参考的来源.

编辑

对于新用户的实际创建,在第二个auth引用上验证没有人,或者其他人,然后是管理员,因为创建帐户所需要的只是auth引用本身.

以下内容尚未经过测试,但需要考虑

您需要考虑的事情是将数据写入firebase.通常的做法是用户可以编辑/更新自己的用户信息,因此当您使用第二个auth引用进行编写时,这应该可行.但是,如果您拥有该用户的角色或权限,请确保使用具有正确权限的auth引用来编写该角色或权限.在这种情况下,主auth是admin,第二个auth是新创建的用户.

  • 这真的对我很有帮助,谢谢!要添加的一件事是我必须添加'secondaryApp.delete();' 阻止firebase告诉我全局注册了另一个应用程序. (8认同)
  • @FrankvanPuffelen好好闭嘴.这是正确的(当然).然后导致问题; 为什么要做出改变开始?Kinda似乎违反直觉,因为当任何人仍然可以创建帐户时,创建用户的auta'd帐户.奇怪的.无论如何,这是一个*BRILLIANT*答案. (2认同)
  • @AndréKool:我们刚刚发布了一个firebase-admin SDK,它不需要使用你的(诚然聪明的)解决方法.请参阅[我在下面的更新答案](http://stackoverflow.com/a/37614090/209103). (2认同)

Fra*_*len 18

更新20161108 - 以下原始答案

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

原始答案

目前这是不可能的.创建电子邮件+密码用户会自动在新用户中签名.

  • @FrankvanPuffelen我希望移动应用程序用户能够邀请使用`createUserWithEmailAndPassword`并向用户发送电子邮件的用户。我不想在客户端/移动应用中使用firebase-admin SDK。我还有其他选择吗? (2认同)
  • @FrankvanPuffelen 你们有没有理由不向 `createUserWithEmailAndPassword` 添加 `noLogin` 标志?与许多其他人一样,我也需要从前端添加用户,而不使用 Admin SDK。 (2认同)

小智 12

Swift 5:简单的解决方案

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

let originalUser = Auth.auth().currentUser
Run Code Online (Sandbox Code Playgroud)

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

Auth.auth().updateCurrentUser(originalUser, completion: nil)
Run Code Online (Sandbox Code Playgroud)


Jon*_*kas 6

这是一个使用 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;
Run Code Online (Sandbox Code Playgroud)
  1. 从您的应用程序调用此函数
import firebase from 'firebase/app';

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

createUser({ email, password })
  .then(console.log)
  .catch(console.error);
Run Code Online (Sandbox Code Playgroud)
  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);
Run Code Online (Sandbox Code Playgroud)


Pau*_*ato 5

我刚刚创建了一个Firebase函数,该函数在创建Firestore文档时触发(规则仅写给admin用户)。然后使用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();
});
Run Code Online (Sandbox Code Playgroud)

您可以使用函数。https.onCall()

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

叫它。

const createUser = firebase.functions().httpsCallable('createUser');
createUser({userData: data}).then(result => {
    // success or error handling
});
Run Code Online (Sandbox Code Playgroud)