web-dev-qa-db-fra.com

Ajouter des détails supplémentaires sur la table des utilisateurs Firebase

Je travaille sur une application firebase + angularjs et j'utilise l'authentification simple par e-mail et par mot de passe et tout fonctionne correctement.

Je me demande simplement si je peux ajouter des données utilisateur supplémentaires à la table utilisateur utilisée par firebase comme moyen d'authentification par mot de passe + email, comme si je voulais ajouter des informations de facturation et d'autres détails concernant l'utilisateur sans créer de noeud/table supplémentaire sur firebase à stocker. ces données supplémentaires.

32
user3440236

Firebase stocke les utilisateurs de courrier électronique/mot de passe dans un emplacement séparé, auquel vous n’avez pas directement accès. Vous ne pouvez pas développer les données à cet emplacement.

Étant donné que de nombreux développeurs d'applications souhaitent accéder aux données utilisateur dans leur code d'application, il est courant de stocker tous les utilisateurs sous un nœud /users dans la base de données d'application elle-même. L'inconvénient est que vous devez le faire vous-même. Mais l’aspect positif est que vous pouvez stocker toute information supplémentaire si vous le souhaitez.

Voir le guide Firebase sur le stockage des données utilisateur pour un exemple de code. De là:

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)
    });
  }
});
44
Frank van Puffelen

Firebase a un ensemble fixe de propriétés utilisateur qui peut être mis à jour mais pas ajouté.

Cependant, vous pouvez ajouter de petites quantités de données à l'aide de la sérialisation et de la désérialisation à l'aide de JSON.stringify() and JSON.parse()

Et puis utilisez l'une des propriétés inutilisées pour stocker la chaîne

soit dans DisplayName, soit dans la propriété photoURL. N'oubliez pas que les données pouvant être ajoutées doivent être de petite taille et stockées sous forme de chaîne. 

Et cela ne peut être possible qu'en utilisant la méthode du SDK FIREBASE et non le feu angularfire, comme illustré ci-dessous.

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

Vous pouvez stocker plus de données JSON, telles que des données, dans la variable photoURL ou nomAllaYName sous la forme de chaîne ici.

4
Magnus Melwin

Un utilisateur Firebase possède un ensemble fixe de propriétés de base (un identifiant unique, une adresse électronique principale, un nom et une URL de photo) stocké dans la base de données utilisateur du projet, pouvant être mis à jour par l'utilisateur (iOS, Android, Web). Vous ne pouvez pas ajouter directement d'autres propriétés à l'objet Utilisateur Firebase. au lieu de cela, vous pouvez stocker les propriétés supplémentaires dans votre base de données Firebase Realtime.

3
Asad Mirza

REMARQUE: cette méthode ne fonctionne que si vous utilisez Firebase Admin SDK et que vous devez avoir un noeud final sur votre serveur pour gérer les jetons personnalisés.

Firebase Admin SDK dispose d’une option permettant de créer des jetons personnalisés avec un objet de revendication supplémentaire, pouvant contenir des données arbitraires. Cela peut être utile pour stocker des informations relatives à l'utilisateur, par exemple si l'utilisateur est un utilisateur Premium ou non.

Les données de réclamations supplémentaires sont accessibles à l'aide de l'objet auth

exemple 

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 sont également accessibles dans les règles de sécurité Firebase.

pour plus d'informations, lisez Jetons personnalisés Firebase

3
Hari Prasad

Ma réponse n’est pas angulaire, mais j’ai cherché un peu pour savoir comment le faire en utilisant Polymer et Polymerfire et j’ajoute donc cette réponse pour aider les gens à le faire plus rapidement que moi.

J'ai dû ajouter un nœud distinct à db, comme l'a mentionné Frank van Puffelen.

Importations: 

<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">

Ensuite, placez n'importe où dans votre application un composant <firebase-app>:

<firebase-app
  name="yourAppName"
  api-key= "{{yourApi}}"
  auth-domain= "{{yourAuthDomain}}"
  database-url= "{{yourDbUrl}}"
>
</firebase-app>

Après cela, vous devrez utiliser <firebase-auth> et <firebase-document>:

Modèle :

<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>

Scénario:

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

Et voilà, vous voudrez peut-être jeter un coup d'œil à cet excellent google codelab qui constitue une bonne introduction à l'utilisation de firebase avec un polymère.

2
Olivier Krull

La réponse de Frank est bonne mais les choses sont un peu différentes dans Angular 6/Firebase 5/Angularfire 5:

Voici mon gestionnaire de clic pour la connexion d'un utilisateur:

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
Mike Spear

Veuillez noter que cette méthode a été modifiée dans la v4.0.0. Par conséquent, vous devez utiliser le code ci-dessous pour récupérer le profil d'utilisateur:

afAuth.authState.subscribe((user: firebase.User) => { 
  this.displayName = user.displayName;
  this.email = user.email;
  this.photoURL = user.photoURL;
});
0
Arash

Voici une version de Swift. Votre structure d'utilisateur ("table") est comme

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

Après avoir passé l'auth FIRAuth.auth()?.createUser, vous pouvez définir les utilisateurs dans la base de données comme suit:

        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)
0
William Hu