Firebase Authentifikation mit Privaten Schlüssel generieren

  • Antworten:21
  • Bentwortet
Volkan Aydin
  • Forum-Beiträge: 187

04.05.2020, 22:04:49 via Website

Hallo Androitpit Team!

Ich möchte (wie immer;) ) zuerst einmal bedanken für die Hilfe die Ihr mir immer wieder gegeben habt. und wieder hoffe und zähle ich auf euch ;)

Ich habe mich nun überwunden mit der echtzeitdatenbanken von Firebase zu arbeiten, gefällt mir, und scheint doch sinnvoller zusein als ich zuerst dachte.
mittlerweile ist das ein und austragen,wie updaten kein problem. nun kommt der nächste Schritt. Im moment ist dor alles auf .read und .write
Gerne würde ich eine Private anmeldung durchführen, soll heissen, ohne Google, ohne Facebook, ohne Twitter etc.
ich habe gerademal verstanden das ich einen Privaten schlüssel generieren muss (das hab ich geschafft) nun soll ich den auf den Server Kopieren. und hier liegt das Problem? auf welchen Server? ich habe einen Server gemietet wo meine Webseite drauf ist. soll ich in einfach dort in einen Pfad kopieren, und wenn ja, wo muss ich das in der APK mitteilen, wo dieser liegt? Wie immer liegt hier meine Schwäche im English
Ich kann zwar lesen, und übersetzten aber ich verstehe nicht!

The new service account's public/private key pair is automatically saved on your computer. Copy this file to your authentication server. 

Ist ein "authentication server" etwas was ich einrichten muss? wenn ja, könnt ihr mir da kurz auf die sprünge helfen? Ich stehe echt auf dem schlauch!

Kommentieren
Beste Antwort
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.05.2020, 10:21:43 via Website

Hallo Volkan,

wohler hast du das mit dem privaten Schlüssel? Was ist hier deine Anleitung?
Im normalfall brauchst du eine normale Authentifizierung.
Wenn du eh schon firebase nutzt würde ich mir das anschauen:
https://firebase.google.com/docs/auth

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Volkan Aydin
Kommentieren
Volkan Aydin
  • Forum-Beiträge: 187

05.05.2020, 18:14:02 via Website

Also meine Quellen waren:

https://firebase.google.com/docs/database/security mit dem Video
https://www.youtube.com/watch?time_continue=264&v=PUBnlbjZFAI&feature=emb_logo
und landete dann irgendwie auf:
https://firebase.google.com/docs/auth/unity/custom-auth

Also, um Meine Gedanken zu erläutern.
So wie ich es verstanden habe, kann Firebase selber einen String Key generieren bei jedweiligen einträgen mit push().
Jedoch wenn ich in in die Regeln sehe, muss die App ja bei einem login, einen Key beim User "verinnerlichen", so das ich bei den Firebase Regeln, eingeben kann $uid darf .read oder .write. bei diesem Pfad.

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

Kurz gesagt, wie wird $uid übergeben, oder gespeichert? nach langsem suchen landete ich auf der seite wo man einen Privaten Scchlüssel ersetllen musste.... wenn man Google oder Facebook nicht verwenden wollte?!?

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.05.2020, 19:59:08 via Website

Für die eigentliche Authentifizierung würde ich auf jeden Fall das hier verwenden:
https://firebase.google.com/docs/auth/android/password-auth
Ist genau beschrieben, wie es funktioniert.

Danach kannst du deine Regeln in der DB einstellen, dabei ist wichtig, dass du dir überlegst ob jeder User lesen und schreiben darf.
Wenn ja dann steht das ja so in dem beispiel:

{   "rules": {
    "foo": {
      ".read": true,
      ".write": true 
    }   } }

wrirte noch in true geändert, damit jeder user lesen ud schreiben darf.

Falls du das auf bestimmte User einschränken willst, brauchst du deren UserId, die bekommst duaber nur, wenn ein Accout erstellt wurde, also wenn du die Firebase Auth schon implementiert hast.
Ansonsten musst du auf App seite vermutlich nichts ändern außer vlt der Firebase API den Login übergeben, das dürfte aber über die Doku zu finden sein.

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Volkan Aydin
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

05.05.2020, 20:33:14 via Website

Hallo
Ja das mit $uid ist eine variable die den eingeloggten user indeivizirt. Mehr nicht.

Du oder der User muß sich vorher einen Account angelegt haben.

Dazu musst du das auch in der console akivirt haben. Erste einfachster login ist mit email und einem password was der user erstellt. So nun hast du in der console die Möglichkeit zu sagen das reicht oder du schickst ihm eine Bestätigungs Mail auf die er auch antworten muss.
Außer der klassischen Email Anmeldung gibt es noch andere.
Es gibt auch eine anonyme Anmeldung.
Das, alles muss aber vorher erst in der console eingeschaltet und eingerichtet werden.
Außerdem brauchst du das anmelden auch in deiner app. Ohne wird es nicht gehen.

Oder du machst wieder die Standart rule wo jeder auf deine DB zugreifen kann.

— geändert am 05.05.2020, 20:35:25

Hilfreich?
Volkan Aydin
Kommentieren
Volkan Aydin
  • Forum-Beiträge: 187

05.05.2020, 20:45:13 via Website

So weit so klar, nur wie setze ich es in die Console?

Ich habe vorhin gerade

mFirebaseAnalytics.setUserId("123456");

Ich nehme mal an, dies ist für Google Analytics, jetzt will ich das doch genau für die echtzeit Datenbank. Dann würde ich die Primery Key die erstellt wurde zum Kontakt dazu nutzen. Doch ich finde es einfach nicht. Ich steh total auf dem schlauch! :(

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

05.05.2020, 20:50:58 via Website

Nein was du suchst ist die Authentifizierung. Ist auch in der console oben im menue das erste.

Hilfreich?
Kommentieren
Volkan Aydin
  • Forum-Beiträge: 187

05.05.2020, 20:52:47 via Website

uno momento.... du hast mir ja einen link gesendet in deinem ersten beitrag...... jetzt komm ich vieleicht drauf...... leider musst ich erneut posten da ich meinen beitrag oben nicht editieren kann.... gib mir nochmal nen Tag! ;) Vielen dank schon mal im Vorraus, ich glaub ich weiss jetzt wie das ganze funktionieren soll ;)

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

05.05.2020, 20:55:15 via Website

Übrigens das mit dem link war nicht ich sondern Pascal

Hilfreich?
Pascal P.
Kommentieren
Volkan Aydin
  • Forum-Beiträge: 187

05.05.2020, 20:56:32 via Website

sorry! ;) und/aber trotzdem danke ;)

Hilfreich?
Kommentieren
Volkan Aydin
  • Forum-Beiträge: 187

05.05.2020, 21:11:43 via Website

Nur noch einmal ganz kurz, leider muss ich gleich los :( ...

Ich bin zurzeit auf :
https://firebase.google.com/docs/auth/android/password-auth

After a user signs in for the first time, a new user account is
created and linked to the credentials—that is, the user name and
password, phone number, or auth provider information—the user signed
in with. This new account is stored as part of your Firebase project,
and can be used to identify a user across every app in your project,
regardless of how the user signs in.

In your apps, you can get the user's basic profile information from the FirebaseUser object. See Manage Users.

In your Firebase Realtime Database and Cloud Storage Security Rules, you can get the signed-in user's unique user ID from the auth

variable, and use it to control what data a user can access.

You can allow users to sign in to your app using multiple
authentication providers by linking auth provider credentials to an
existing user account.

Verstehe ich das richtig, Firebase übernimmt die Überprüfung des Logins und tragt die seperat ein? ich brauche die daten nicht in der Echtzeitdatenbank einzutragen ( Wie ich es Jahrelang mit Mysql und php gemacht habe?,) um diese dann zu verwenden, zb für weitere User spezifische informationen ?

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

05.05.2020, 21:15:53 via Website

Nicht ganz speziivische Daten zb ob der User admin ist must du schon selber machen.

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.05.2020, 21:30:41 via App

aber das geht natürlich dann auch über Firebase, wenn dann ist alles an einer Stelle

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
Volkan Aydin
  • Forum-Beiträge: 187

06.05.2020, 22:14:14 via Website

YES YES YES ! Vielen Dank euch beiden! Es hat geklappt. Ich konnte mich schon mal übers google Konto einloggen. Ich bin zuerst wirklich davon ausgegangen, das ich den Key, selber generieren muss und das die Regel Überprüfung dazu, direkt in der Echtzeitdatenbank gemacht wird.

Ich werde mich demnächst bestimmt nochmal melden da ich schon wieder an zwei Probleme gestossen bin ;)

erstens bei den Regeln:

Simulation fehlgeschlagen – Zeile 7: Unknown variable '$uid'.

und wegen der Mail/Passwort Registrierung

ist nicht ordnungsgemäß verknüpft
Bei der DNS-Konfiguration ist ein Problem aufgetreten. Überprüfen Sie diese Konfiguration in Firebase Hosting. Hinweis: Es kann bis zu 24 Stunden dauern, bis die Änderungen in der DNS-Konfiguration gezeigt werden.

Wer weiss, vieleicht schaff ich es ja selbst!

Schönen Abend euch!

— geändert am 06.05.2020, 22:18:50

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

06.05.2020, 22:36:17 via App

wie sehen deine Regeln aus?
Die Uid variable müsste natürlich durch deine UserId ersetzt werden

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
Volkan Aydin
  • Forum-Beiträge: 187

07.05.2020, 21:12:06 via Website

Jetzt sind wir wieder am Anfang! ;) ne kleiner Scherz, bevor ich jetzt anfange "dieses Problem" zu lösen, möchte ich dir darauf antworten ....

Ich möchte mit Firebase eine DatenbankStruktur bilden die anhand ihrer Key generiert wird... also etwa so:

 dbr.child(user.getUid()).setValue(users, new DatabaseReference.CompletionListener() {
                        @Override
                        public void onComplete(@Nullable DatabaseError databaseError, @NonNull DatabaseReference databaseReference) {
                            if(databaseError==null){
                                Toast.makeText(ctx,"Registrierung erfolgreich",Toast.LENGTH_LONG).show();

So inetwa sieht dann die Echtzeitdb aus

{"users" : {
    "-M6PtZMGJio9Twg9qG-P" : {
      "mail" : 1,
      "mail_password" : "c81e728d9d4c2f636f067f89cc14862c_c4ca4238a0b923820dcc509a6f75849b",
      "names" : "da",
      "nickname" : "du",
      "password" : "c4ca4238a0b923820dcc509a6f75849b",
      "vorname" : "sola"
    },
    "-M6PtoRR4BIpiG8rC8Fe" : {
      "mail" : "2",
      "mail_password" : "c81e728d9d4c2f636f067f89cc14862c_c4ca4238a0b923820dcc509a6f75849b",
      "names" : "1",
      "nickname" : "1",
      "password" : "c4ca4238a0b923820dcc509a6f75849b",
      "vorname" : "1"
    },/////
 }
"-M6PtZMGJio9Twg9qG-P":{
   db1:{
      "blablabla":"dada"
    },
   db2:{
    "dumdididum":""lala"   
   }
}"-M6PtoRR4BIpiG8rC8Fe":{
   db1:{
      "blablabla":"dada"
    },
   db2:{
    "dumdididum":""lala"   
   }
}

nun werden die Keys ja mit der Firebase Authentifikation generiert, bzw. ich nehme den FirebaseAuth.getInstance().getCurrentUser(); key
als Hauptstamm, damit die ladezeiten kurz bleiben in dem ich jeweils ihnen die rechte zu ihrer eigenen Datenbank gebe!....?

Nun dachte ich eben das $UID eben diese Variable ist die, die Datenbank abruft, also den FirebaseAuth.getInstance().getCurrentUser(); key, genau den Key den ich von anfang an ohne Google Facebook etc. generieren muss, sonder über meinen Server generiert wird ( so, der Kreis hat sich geschlossen ;) )

Wenn ich da etwas total falsch machen, bitte erläutern, ansonsten mach ich mich mal auf die Suche ;)

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

07.05.2020, 21:22:47 via Website

Wie gesagt ich habe damit noch nichts umgesetzt ,aber rein von der logik her sollte dies passen

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

08.05.2020, 11:58:23 via Website

Hallo erstmal ein paar Grundlegende Fragen zu deiner DB und Authentifizierung.

Beim Login wird ja jeden User eine id automatisch zugewiesen. Bei der authentication ist leider nur email,
pw und die id gespeichert, oder du erstellt noch ein Token.

Deshalb hast du auch den Namen usw in einem neuen Objekt "users" gespeichert. Nur wo ist in diesem Objekt die id die dem User beim login zugeteilt wurde?

Es ist ja so das immer nur ein User Eingeloggt ist aus der sicht deiner App gesehen. Und denn fragst du ab kannst ihn auch in deiner User Tabelle Speichern.

So nun willst du das nur der eine User genau auf seine Daten in dem User Objekt schreiben kann.

Deine Rule scheint mir etwas falsch zu sein.

Du hast eine Variable namens $uid erstellt und nun musst du die id im usrer Objekt mit dem aktuell eingeloggten User vergleichen ist es der richtige User also true wird das Schreiben ermöglicht. Das macht alles deine Rule.

Nur musst du dir auch das richtige Child / Objekt holen.
Das geht mit
data.child(' ').val() wobei in der Klammer das der bezeichner der ID stehen sollte.

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "data.child('  ').val() === auth.uid"
      }
    }
  }
}

Solche ähnliche Regeln musst du für alle deine Objekte in der DB erstellen.

— geändert am 08.05.2020, 17:49:23

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

08.05.2020, 12:02:14 via Website

Wenn du später Daten in deine DB speicherst solltest du immer auch den user der die Daten gesendet hat mit speichern. Um dann die Zugriffs Rechte verwalten zu können.

Rules werden von oben nach unten durchlaufen ist eine Abfrage true ist es erledigt und der Zugriff wird gewährt.

Schau dir die Doku dazu an.

— geändert am 08.05.2020, 17:37:02

Hilfreich?
Pascal P.
Kommentieren
Volkan Aydin
  • Forum-Beiträge: 187

09.05.2020, 18:14:32 via Website

Das mit den Regeln werde ich mir noch ein bisschen einverleiben müssen. ich werde es sicher noch ein paar mal durch probieren, bis ich das beginne zu verstehen ;)

Deshalb hast du auch den Namen usw in einem neuen Objekt "users" gespeichert. Nur wo ist in diesem Objekt die id die dem User beim login zugeteilt wurde?

Die id is eben die $Uid? Ich dachte jedenfalls ich solle das machen, resp.
Der eintrag sieht wie folgt aus:

DatabaseReference dbr = fb.GET_users();
                    FirebaseTable.FB_users users = new FirebaseTable.FB_users(
                            "",
                            "",
                            user.getDisplayName(),
                            user.getEmail(),
                            "",
                            ""
                    );
                    dbr.child(user.getUid()).setValue(users, new DatabaseReference.CompletionListener()....

Also anstatt

dbr.push().setValue(

verwende ich

dbr.child(user.getUid()).setValue(

und verwende gleich die generierte UserId als Key für die "users" DB in Firebase ? Ist das eher schlecht?

— geändert am 09.05.2020, 18:17:48

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

09.05.2020, 19:21:26 via Website

Hallo was mich interessiert hatte ist welcher Schlüssel Objekt oder Key die UID ist. In deiner User Tabelle.

"-M6PtZMGJio9Twg9qG-P" : {
  "mail" : 1,
  "mail_password" : "c81e728d9d4c2f636f067f89cc14862c_c4ca4238a0b923820dcc509a6f75849b",
  "names" : "da",
  "nickname" : "du",
  "password" : "c4ca4238a0b923820dcc509a6f75849b",
  "vorname" : "sola"
},

Ist "-M6PtZMGJio9Twg9qG-P" die ID ? Also der Objekt Key ist gleich der User ID?
Oder was ist sonst die User ID die beim Login angelegt wird.
mei mir sieht so eine ID anders aus zB. "VEKZQprl6AWuoTi8SZjV3a2hUd83"

wenn der Key der User ist solte deine Rule in etwa so ausehen.

{
"rules": {
"users": {
"$uid": {
".read": "auth != null",
".write":"root.child('users').hasChild(auth.uid)"
}
}
}
}

damit kannst du alles lesen aber nur der usere kann in seine Daten ändern schreiben.

und verwende gleich die generierte UserId als Key für die "users" DB in Firebase ? Ist das eher schlecht?

nein nur ist dann die Rules und der zugriff etwas anders . habe ich dir ja nun gezeigt.

— geändert am 09.05.2020, 19:36:49

Hilfreich?
Volkan Aydin
Kommentieren
Volkan Aydin
  • Forum-Beiträge: 187

10.05.2020, 15:38:41 via Website

Ich verstehe was du meinst, aber noch nicht wie die regel funktioniert, ich denke aber, ich werde mal zuerst ein paar endere Einträge und Daten eintragen und dann herumspielen, und aufdeinen letzten beitrag zurückkommen! Vielen Dank für deine (eure hilfe) ich schliss das Thema mal ab. Ihr werdet bestimmt nochmal von mir hören!
Noch einen Schönen Sonntag!

Hilfreich?
Pascal P.
Kommentieren