在Firebase用户表上添加额外细节

55

我正在开发一个使用firebase和angularjs的应用程序,我正在使用简单的电子邮件和密码身份验证,它正常工作。

我想知道是否可以在firebase email+password auth使用的用户表中添加额外的用户数据,例如我想添加与用户有关的账单信息和其他详细信息,而不必在firebase上创建额外的节点/表来存储这些附加数据。

9个回答

61
Firebase将电子邮件/密码用户存储在一个你无法直接访问的单独位置。你无法扩展此位置中的数据。
由于许多应用程序开发人员希望在他们的应用程序代码中访问用户数据,因此将所有用户存储在应用程序数据库本身内的/users节点下是一种常见做法。这样做的缺点是你必须自己完成。但积极的一面是如果你想要,你可以存储任何额外信息。
参见Firebase指南中的用户数据存储来获取示例代码。从那里开始:
var ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com");
ref.onAuth(function(authData) {
  if (authData && isNewUser) {
    // save the user's profile into Firebase so we can list users,
    // use them in Security and Firebase Rules, and show profiles
    ref.child("users").child(authData.uid).set({
      provider: authData.provider,
      name: getName(authData)
    });
  }
});

请给我指点。在新的Firebase SDK 3中,至少对于Angular来说,没有可用的.onAuth函数。我猜应该使用getAuth()代替。https://github.com/firebase/angularfire/blob/master/docs/reference.md#getauth 然而,在getAuth()返回的对象中,没有提供用户的信息。 - KhoPhi
请参阅 https://firebase.google.com/docs/auth/android/manage-users#get_the_currently_signed-in_user 以获取有关管理用户的当前登录用户的信息。 - Frank van Puffelen
@FrankvanPuffelen..有安卓开发的相关示例吗? - Guruprasad J Rao

9
一个 Firebase 用户具有一组固定的基本属性——唯一 ID、主电子邮件地址、名称和照片 URL,存储在项目的用户数据库中,可以由用户(iOS、Android、Web)更新。您不能直接向 Firebase 用户对象添加其他属性;相反,您可以将附加属性存储在 Firebase 实时数据库中。

9

注意:此方法仅适用于使用Firebase Admin SDK的情况,并且您需要在服务器上拥有端点来管理自定义令牌。

Firebase Admin SDK具有创建带有附加声明对象的自定义令牌选项,该对象可以包含任意数据。这可能对存储一些与用户相关的信息很有用,例如用户是否为高级用户。

可以使用auth对象访问附加声明数据。

示例:

var uid = "some-uid"; //this can be existing user UID
var additionalClaims = {
   premiumAccount: true,
   some-user-property: 'some-value'
};

admin.auth().createCustomToken(uid, additionalClaims)
  .then(function(customToken) {
     // Send token back to client
  })
  .catch(function(error) {
     console.log("Error creating custom token:", error);
});

additionalClaims 在 Firebase 安全规则中也是可访问的。

更多信息请阅读Firebase 自定义令牌


Firebase身份验证自定义令牌在一小时后过期。因此,它似乎不是永久存储附加数据的好方法。 - Sergey Zubkov
只有访问令牌过期,但上述方法生成的自定义令牌是具有长期有效性的刷新令牌。 - Hari Prasad

6
Firebase有一组固定的用户属性,可以进行更新但无法添加其他属性。
不过,您可以使用序列化和反序列化来添加少量数据,使用JSON.stringify() 和 JSON.parse()方法将其转换为字符串,然后将其存储在未使用的属性之一中,例如DisplayName或photoURL属性。请注意,所添加的数据必须小且以字符串形式存储。这只能通过使用FIREBASE SDK中的方法实现,而不能使用angularfire,如下所示。
var user = firebase.auth().currentUser;

user.updateProfile({
  displayName: "Jane Q. User",
  photoURL: "https://example.com/jane-q-user/profile.jpg"
}).then(function() {
  // Update successful.
}, function(error) {
  // An error happened.
});

您可以在此处以字符串形式存储更多类似JSON的数据,例如在photoURL或displayName变量中。

错误:photoURL字段必须是有效的URL。 - Mordy Stern

4

我的答案与Angular无关,但我经过了一番搜索,找到了使用PolymerPolymerfire进行操作的方法。因此,我添加了这个答案来帮助人们比我更快地完成它。

正如Frank van Puffelen所提到的,我不得不向数据库添加一个单独的节点。

导入:

<link rel="import" href="../bower_components/polymerfire/firebase-app.html">
<link rel="import" href="../bower_components/polymerfire/firebase-auth.html">
<link rel="import" href="../bower_components/polymerfire/firebase-document.html">

然后在你的应用程序中任何地方放置一个 <firebase-app> 组件:
<firebase-app
  name="yourAppName"
  api-key= "{{yourApi}}"
  auth-domain= "{{yourAuthDomain}}"
  database-url= "{{yourDbUrl}}"
>
</firebase-app>

接下来,您需要使用<firebase-auth><firebase-document>

模板:

<firebase-auth
  id="auth"
  app-name="yourAppName"
  signed-in="{{signedIn}}"
  user="{{user}}">
</firebase-auth>

<firebase-document
  id="document"
  app-name="yourAppName"
  path="{{usersPath}}"  // e.g "/users"
  data="{{userDocument}}">
</firebase-document>

脚本:

this._register = function(){
  var formValid = this.querySelector('#register-form').validate();
  var auth = this.querySelector('#auth');
  if(formValid && this.passWordsIdentic){

  //The actual registration
  auth.createUserWithEmailAndPassword(this.email, this.password).then(function(user){
    console.log('auth user registration succes');

    //Example values
    this.userDocument.uid = user.uid;
    this.userDocument.email = user.email;
    this.userDocument.firstName = this.firstName;
    this.userDocument.lastName = this.lastName;
    this.userDocument.userName = this.userName;
    this.$.document.save(this.usersPath).then(() => {
        console.log("custom user registration succes");
        this.$.document.reset();
      });
     }.bind(this)).catch(function(error) {
       var errorCode = error.code;
       var errorMessage = error.message;
       console.log('error: ', errorCode);
     );
    }
  }

就是这样,你可能想要查看这个优秀的谷歌代码实验室,这是一个很好的介绍如何使用Firebase和Polymer的入门教程。


1

这是注册代码,用于在用户表中添加额外的字段

  import { AngularFireAuth } from "@angular/fire/auth";

  constructor(private firebaseAuth: AngularFireAuth){}

  registration(data: any, password: any) {
    return this.firebaseAuth.auth.createUserWithEmailAndPassword(data.Email, password)
      .then(res => {
        res.user.updateProfile({
          displayName: `${data.DisplayName}`
        })

    data.UserId = res.user.uid;
    data.PhoneNumbers = [{
      NumberType: '',
      NumberValue: ''
    }];

    data.PhotoUrl = '';
    data.Addresses = [{
      AddressLine1: '',
      AddressLine2: '',
      City: '',
      State: '',
      Country: '',
      PostalCode: '',
      AddressType: ''
    }];

    data.IsDeleted = false;
    this.fireStore.doc(`users/${res.user.uid}`).set(data);
    this.toastr.success('User has been register successfully!', 'Successfull!');
    return true;
  }).catch(err => {
    switch (err.code) {
      case 'auth/email-already-in-use':
        this.toastr.error(`Email address ${data.Email} already in use.`, 'Error!');
        break;
      case 'auth/invalid-email':
        this.toastr.error(`Email address ${data.Email} is invalid.`, 'Error!');
        break;
      case 'auth/operation-not-allowed':
        this.toastr.error('Error during sign up.', 'Error!');
        break;
      case 'auth/weak-password':
        this.toastr.error('Password is not strong enough. Add additional characters including special characters and numbers.', 'Error!');
        break;
      default:
        this.toastr.error(err.message, 'Error!');
        break;
    }
  });

}


0

Frank的答案不错,但在Angular6/Firebase5/Angularfire5中有些不同:

这是我的点击处理程序,用于登录用户:

this.afAuth.auth.signInWithPopup(new firebase.auth.GoogleAuthProvider()).then((e) => {
      console.log("Log-In Success" + e.additionalUserInfo.profile.name);
      if (e.additionalUserInfo.isNewUser)
        this.addUserToDatabase(/*...*/);
    }).catch((error) => {
      console.log("Log-In Error: Google Sign-In failed");
    });

0
请注意,v4.0.0中的方法已更改。因此,您需要使用以下代码来检索用户配置文件:
afAuth.authState.subscribe((user: firebase.User) => { 
  this.displayName = user.displayName;
  this.email = user.email;
  this.photoURL = user.photoURL;
});

0

这是一个Swift版本。您的用户结构(“表”)如下:

--users:
-------abc,d@email,com:
---------------email:abc.d@email.com
---------------name: userName
etc.

在通过身份验证 FIRAuth.auth()?.createUser 后,您可以按照以下方式将用户设置到数据库中:

        let ref = FIRDatabase.database().reference()
        let rootChild = ref.child("users")
        let changedEmailChild = u.email?.lowercased().replacingOccurrences(of: ".", with: ",", options: .literal, range: nil) // Email doesn't support "," firebase doesn't support "."
        let userChild = rootChild.child(changedEmailChild!)
        userChild.child("email").setValue(u.email)
        userChild.child("name").setValue(signup.name)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接