it-swarm.com.de

Fügen Sie zusätzliche Details zur Firebase-Benutzertabelle hinzu

Ich arbeite an einer Firebase + Winkljs-App und verwende die einfache E-Mail- und Passwort-Authentifizierung, und sie funktioniert ordnungsgemäß.

Ich frage mich nur, ob ich zusätzliche Benutzerdaten in der Benutzertabelle hinzufügen kann, die von firebase email + password auth verwendet wird, so wie ich Rechnungsinformationen und andere Informationen zum Benutzer hinzufügen möchte, ohne zusätzliche Knoten/Tabellen auf firebase zum Speichern zu erstellen diese zusätzlichen Daten.

32
user3440236

Firebase speichert die E-Mail-/Kennwortbenutzer an einem separaten Ort, auf den Sie keinen direkten Zugriff haben. Sie können die Daten an diesem Speicherort nicht erweitern.

Da viele Anwendungsentwickler auf die Benutzerdaten in ihrem Anwendungscode zugreifen möchten, ist es üblich, alle Benutzer unter einem /users-Knoten in der Anwendungsdatenbank selbst zu speichern. Der Nachteil ist, dass Sie dies selbst tun müssen. Die positive Seite ist jedoch, dass Sie zusätzliche Informationen speichern können, wenn Sie möchten.

Beispielcode finden Sie im Firebase-Handbuch zum Speichern von Benutzerdaten . Von dort:

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

Firebase verfügt über einen festen Satz von Benutzereigenschaften, die aktualisiert, jedoch nicht hinzugefügt werden können.

Sie können jedoch kleine Datenmengen mithilfe von Serialisierung und Deserialisierung mithilfe von JSON.stringify() and JSON.parse() hinzufügen. 

Verwenden Sie dann eine der nicht verwendeten Eigenschaften, um die Zeichenfolge zu speichern

entweder in DisplayName oder in der photoURL-Eigenschaft. Denken Sie daran, dass die Daten, die hinzugefügt werden können, klein sein und als Zeichenfolge gespeichert werden müssen. 

Dies kann nur mit der Methode im FIREBASE-SDK und nicht mit dem Winkelfeuer wie unten gezeigt möglich sein

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

Sie können hier mehr json-ähnliche Daten in der Variable photoURL oder displaYName in Form einer Zeichenfolge speichern.

4
Magnus Melwin

Ein Firebase-Benutzer verfügt über festgelegte grundlegende Eigenschaften - eine eindeutige ID, eine primäre E-Mail-Adresse, einen Namen und eine Foto-URL -, die in der Benutzerdatenbank des Projekts gespeichert sind und vom Benutzer aktualisiert werden können (iOS, Android, Web). Sie können dem Firebase-Benutzerobjekt keine anderen Eigenschaften direkt hinzufügen. Stattdessen können Sie die zusätzlichen Eigenschaften in Ihrer Firebase-Echtzeitdatenbank speichern.

3
Asad Mirza

HINWEIS: Diese Methode funktioniert nur, wenn Sie das Firebase Admin SDK verwenden und auf Ihrem Server einen Endpunkt haben müssen, um benutzerdefinierte Token verwalten zu können

Das Firebase Admin SDK bietet eine Option zum Erstellen benutzerdefinierter Token mit zusätzlichen Claims-Objekten, die beliebige Daten enthalten können. Dies kann nützlich sein, um benutzerbezogene Informationen zu speichern, z. B. ob der Benutzer ein Premium-Benutzer ist oder nicht.

Zusätzliche Anspruchsdaten sind über das Objekt auth zugänglich. 

beispiel 

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

Auf additionalClaims kann auch in den Firebase-Sicherheitsregeln zugegriffen werden.

weitere Informationen finden Sie unter Firebase Custom Token

3
Hari Prasad

Meine Antwort ist nicht eckig, aber ich habe ein bisschen gesucht, um herauszufinden, wie man sie mit Polymer und Polymerfire ausführt. Ich füge diese Antwort hinzu, damit die Leute es schneller erledigen können.

Ich musste db einen eigenen Knoten hinzufügen, wie Frank van Puffelen erwähnte.

Importe: 

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

Platzieren Sie an beliebiger Stelle in Ihrer App eine <firebase-app>-Komponente:

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

Danach müssen Sie <firebase-auth> und <firebase-document> verwenden:

Vorlage :

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

Skript:

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

Und das ist es, vielleicht möchten Sie einen Blick auf dieses exzellente google codelab werfen, das eine gute Einführung in die Verwendung von Firebase mit Polymer darstellt.

2
Olivier Krull

Die Antwort von Frank ist gut, aber in Angular 6/Firebase 5/Angularfire 5 sieht es etwas anders aus:

Hier ist mein Click-Handler zum Anmelden eines Benutzers:

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

Bitte beachten Sie, dass die Methode in v4.0.0 geändert wird. Daher müssen Sie den folgenden Code verwenden, um das Benutzerprofil abzurufen:

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

Hier ist eine schnelle Version. Ihre Benutzerstruktur ("Tabelle") ist wie

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

Nachdem Sie die auth FIRAuth.auth()?.createUser bestanden haben, können Sie die Benutzer in der Datenbank wie folgt festlegen:

        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