Добавить дополнительные сведения в таблицу пользователей Firebase

Я работаю над приложением firebase + angularjs, и я использую простую аутентификацию по электронной почте и паролю, и она работает правильно.

Мне просто интересно, могу ли я добавить дополнительные пользовательские данные в пользовательскую таблицу, которая используется firebase email + password auth, например, я хочу добавить информацию о выставлении счетов и другие детали, касающиеся пользователя, без создания дополнительного узла / таблицы на firebase для хранения эти дополнительные данные.


person user3440236    schedule 24.06.2015    source источник


Ответы (9)


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)
    });
  }
});
person Frank van Puffelen    schedule 25.06.2015
comment
Пожалуйста, просветите меня. В новом firebase sdk 3 функция .onAuth недоступна, по крайней мере, для angular. Думаю, вместо этого должен работать getAuth(). github.com/firebase/angularfire/blob/master/docs/ Однако в getAuth() возвращаемом объекте для пользователя нет поставщика. - person KhoPhi; 12.06.2016
comment
@ FrankvanPuffelen .. Есть такие примеры для разработки под андроид? - person Guruprasad J Rao; 22.02.2017

ПРИМЕЧАНИЕ. Этот метод работает только в том случае, если вы используете 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.

person Hari Prasad    schedule 20.01.2017
comment
Срок действия специальных токенов Firebase Authentication истекает через час. Так что это не лучший способ постоянного хранения дополнительных данных. - person Sergey Zubkov; 26.11.2020

Пользователь Firebase имеет фиксированный набор основных свойств - уникальный идентификатор, основной адрес электронной почты, имя и URL-адрес фотографии - которые хранятся в пользовательской базе данных проекта и могут быть обновлены пользователем (iOS, Android, Интернет). Вы не можете напрямую добавлять другие свойства к объекту Firebase User; вместо этого вы можете сохранить дополнительные свойства в базе данных Firebase Realtime.

person Mirza Asad Baig    schedule 16.12.2017

Firebase имеет фиксированный набор пользовательских свойств, которые можно обновлять, но нельзя добавлять.

Однако вы можете добавить небольшие объемы данных с помощью сериализации и десериализации, используя JSON.stringify() and 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 в виде строки здесь.

person Magnus Melwin    schedule 18.01.2017
comment
что дает ошибку Ошибка: поле photoURL должно быть действительным URL. - person Mordy Stern; 11.12.2019

Мой ответ не связан с angular, но я немного искал, чтобы узнать, как это сделать, используя Polymer и Polymerfire, поэтому я добавляю этот ответ, чтобы помочь людям сделать это быстрее, чем я.

Мне пришлось добавить отдельный узел в db, как упомянул Франк ван Пуффелен.

Импорт:

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

Вот и все, вы можете взглянуть на этот отличный google codelab, который является хорошим введением в использование firebase с полимером.

person Olivier Krull    schedule 22.09.2016

Вот быстрая версия. Ваша пользовательская структура («таблица») похожа на

--users:
-------abc,d@email,com:
---------------email:[email protected]
---------------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)
person William Hu    schedule 23.04.2017

Обратите внимание, что этот метод изменен в версии 4.0.0. Следовательно, вам необходимо использовать приведенный ниже код для получения профиля пользователя:

afAuth.authState.subscribe((user: firebase.User) => { 
  this.displayName = user.displayName;
  this.email = user.email;
  this.photoURL = user.photoURL;
});
person Gharibi    schedule 27.05.2017

Ответ Фрэнка хорош, но в 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");
    });
person Mike Spear    schedule 26.05.2018

Вот код регистрации, в который добавляются дополнительные поля в таблице «Пользователи».

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

}

person Simal Chaudhari    schedule 25.08.2020