Kommunikation zwischen App und Webserver?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Bei relationalen Datenbanken wie MySQL legt man nur eine User Tabelle an, die von allen Nutzern benutzt wird. Das gleiche gilt z.B. für eine Nachrichten Tabelle. Dort liegen dann alle Nachrichten von allen Nutzern.

In deiner User Tabelle wirst du wahrscheinlich Spalten wie ID, Nutzername und Passwort haben. Deine ID vom Nutzer ist dann immer deine Referenz zu deinem gewünschten Nutzer.

Beispiel:

ID | Username | Password
1  | admin    | 1234
2  | user     | 5678
3  | user2    | abcd

Beim Thema Freunde, musst du eine Tabelle anlegen, wo zwei Nutzer verknüpft werden. Das nennt sich dann N:M Beziehung.

Beispiel:

user_id | friend_id
1       | 2
1       | 3
2       | 3

Bei den anderen Bereichen wie Blockierte Nutzer und Chats musst du dir gute Relationen überlegen.

Mit "where" bei SQL kannst du nach bestimmten Nutzern filtern. Mit "join" bekommst du dann weitere Infos vom jeweiligen Freund Nutzer.

vielleicht gesperrte Konten

Attribute, die nur den jeweiligen Nutzer betreffen, solltest du in der Nutzer Tabelle hinterlegen. Ein Boolean mit true/false bzw. 0/1 in SQL, würde ausreichen. Ein Datum, ab wann der Nutzer gesperrt wurde, könnte auch hilfreich sein. Dann könntest du es mit null bzw. einem gesetzten Datum lösen.

Wenn ich dann anfange, eine Konversation zu programmieren. Gibt es auch eine Datenbank, die alle Nachrichten enthält und jedes Telefon fragt jede Sekunde, ob sich etwas geändert hat?

Dafür bietet sich das WebSocket Protokoll an. Der Client baut eine Verbindung zum Server auf und hält diese Verbindung. Der Server kann dann, wenn er es möchte, eine Nachricht an den Client schicken. Für das erste könntest du nur eine Hinweis "neue Nachrichten abholen" schicken, sodass dann der Inhalt per http Anfrage abgeholt wird.

Im Allgemeinen sollte deine Architektur von deinem Dienst so aussehen:

Die Datenbank läuft auf deinem Server und sollte nicht öffentlich erreichbar sein.

Auf dem Server gibt es dann noch eine Server Anwendung, die mit der Datenbank kommuniziert und z.B. REST Endpunkte bereitstellt. Hier befindet sich deine Logik im Server. Wenn eine Nutzernanme vergeben ist, sollte die Registrierung fehlschlagen. Wenn man eine Nutzer blockiert hat, sollte die andere Person keine Freundschaftsanfrage senden können. ...

Deine Anwendung verbindet sich dann per z.B. REST API mit der Server Anwendung.

Krammer456 
Fragesteller
 21.08.2022, 22:24

Hallo, vielen dank!

Könntest du bitte zum einen den Punkt WebSocket noch einmal genauer erklären?

Oben sagst du, ich sollte den Nachrichtenaustausch mit einer Datenbank realisieren und hier erwähnst du das Verwenden eines Websockets. Könntest du noch einmal näher erklären, wie ich die Datenbank und den WebSocket nun realisieren soll?

Zum anderen könntest du bitte die Architektur noch genauer ergänzen?

Ja die Datenbank läuft auf meinen Server. Ich möchte alles von selbst bereitstellen und keine Drittanbieter nutzen. Was meinst du mit öffentlich nicht zugänglich?

Wie meinst du das mid der Serveranwendung und REST Endpunkte?

LG

0
Krammer456 
Fragesteller
 21.08.2022, 22:29
@Krammer456

Ich finde es sehr schwierig zu meinen serverseitigen Problemen etwas im Internet zu finden. Fals dir Quellen bekannt sind, bei denen ich mich zu den oben genannten Fragen einlesen kann wäre ich sehr dankbar!

0
regex9  22.08.2022, 05:50
@Krammer456
Oben sagst du, ich sollte den Nachrichtenaustausch mit einer Datenbank realisieren (...)

Das lese ich in der Antwort von tide1109 nirgendwo. Datenbanken dienen nur dazu, Daten persistent zu speichern. Die tatsächliche Kommunikation muss von deinen Anwendungen (PHP-Anwendung und App) geregelt werden.

Die Überlegung hinsichtlich WebSockets ist diese, dass ein Client (die App), der mit jemanden anders kommunizieren will, eine WebSocket-Verbindung zum Server aufbaut. Solche Verbindungen laufen über ein anderes Protokoll (WS/S) und haben zwei Vorteile gegenüber HTTP/S: Der Nachrichtenaustausch kann viel schneller ablaufen (nahezu in Echtzeit) und ist bidirektional möglich. Letzteres bedeutet noch einmal ausführlicher formuliert, dass nicht nur der Client jederzeit Nachrichten an den Server schicken kann, sondern der Server jederzeit auch Nachrichten an den Client.

Wenn es Neuigkeiten gibt (eine Nachricht eintrudelt), kann der Server selbst reagieren und den Client darüber informieren.

Bezüglich Programmbibliotheken, mit denen du einen WebSocket-Client leicht erstellen und die Kommunikation handhaben kannst, müsstest du einmal recherchieren, da du ja nicht definiert hast, mit welchen Technologien du für die Entwicklung deiner App arbeitest. Schwer etwas für die gängigen Optionen (C#, Java, JavaScript, Kotlin, Swift, ...) zu finden, wird es jedenfalls nicht.

Eine WebSocket-Serverimplementation für PHP bietet Ratchet. Ein Tutorial dazu findest du hier.

Was meinst du mit öffentlich nicht zugänglich?

Wenn du das Hosting und die Konfiguration des Datenbankservers selbst übernimmst, ist es wichtig, dass der nur Anfragen entgegennimmt, die von deinem Webserver kommen. Fremde Quellen dürfen nicht die Erlaubnis haben, Verbindungsersuche / SQL-Anfragen an die Datenbank zu schicken.

Man kann beispielsweise via IP-Whitelist Anfragen filtern.

Wie meinst du das mid der Serveranwendung und REST Endpunkte?

Zu RESTful APIs findest du zahlreiche Quellen im Internet (oder in der Literatur). In der Antwort von tide1109 ist zudem schon ein Artikel verlinkt.

Der wesentliche Teil besteht darin, dass deine App Anfragen (Requests) an deine PHP-Anwendung schickt, wobei Letztere dafür bestimmte URL-Endpunkte zur Verfügung stellt (z.B. /create, /sendmessage, u.ä.). Das REST-Prinzip definiert hierfür bestimmte Richtlinien, um die API einheitlich, flexibel, einfach und sicher zu halten.

Hinsichtlich der Sicherheit wäre es noch günstig, wenn du zu den Begriffen Authentication und Authorization (im Zusammenhang mit APIs) recherchierst.

1
Krammer456 
Fragesteller
 22.08.2022, 11:21
@regex9

Vielen Dank für die ausführliche Erklärung.

Mein ansatz wäre jetzt gewesen, ich erstelle einen Apache Webserver mit HTTP und PHP auf einen Raspberry PI mit dem ich dann auf die Datenbank zugreife.

Wenn du das Hosting und die Konfiguration des Datenbankservers selbst übernimmst, ist es wichtig, dass der nur Anfragen entgegennimmt, die von deinem Webserver kommen.

Wie ist das hier gemeint. Ich programmiere die App in Android Studio mit Java und greife momentan über http request auf die php Dateien im Webserver zu. Diese php Skripte führen dann die jeweiligen Datenbankoperationen aus. Entspricht das dem Argument

dass der nur Anfragen entgegennimmt, die von deinem Webserver kommen.
0
regex9  22.08.2022, 11:48
@Krammer456

Angenommen, du schickst mir die Verbindungsdaten zur Datenbank (Datenbankname, Hostname, Credentials) und ich schreibe mir dazu ein PHP-Skript o.ä., welches versucht, sich mit der Datenbank zu verbinden. Dann sollte dieser Verbindungsversuch vom Datenbankserver abgelehnt werden, da er von einer fremden Quelle (nicht deinem Webserver) kommt.

0
Nun meine Frage. Ist das der richtige Weg?

Für ein Hobbyprojekt, welches nie produktiv eingesetzt wird (also mit tatsächlichen Nutzern frei im Netz), ist das Vorgehen in Ordnung.

Andernfalls sei angemerkt, dass ein von XAMPP standardkonfigurierter Apache Server nur für Entwicklungsumgebungen ausgerichtet ist, Verbindungen über TLS laufen sollten und man Passwörter besser nicht im Klartext in der Datenbank speichert.

Wenn ich ein Konto anlege, muss ich dann für jedes Konto mehrere Datenbanken anlegen?

Nein. Eine Datenbank für alle Nutzer genügt. Die jeweiligen Daten werden in unterschiedlichen Datenbanktabellen gespeichert.

Im besten Fall erstellst du dir erst einmal ein Datenbankdesign. Fang mit einem ER-Diagramm an.

Gibt es auch eine Datenbank, die alle Nachrichten enthält (...)?

Wenn es einen Nachrichtenverlauf geben soll, müssen die Nachrichten irgendwo gespeichert werden. Das kann ein Datenspeicher beim Client übernehmen oder zentral beim Server (z.B. die bereits vorliegende Datenbank). Beim Client wäre man im Speicherplatz mehr beschränkt und man hätte stets mehr als eine Quelle, die synchron gehalten werden müsste.

Krammer456 
Fragesteller
 21.08.2022, 21:15

Vielen dank!

Ich hashe die Passwörter mit sha256, damit sie nicht im Klartext vorliegen.

Mit den mehreren Datenbanken war es anders gemeint. Klar speichere ich alle Benutzerdaten in einer Datenbank mit z.B. Benutzername / Email / Passwort, jedoch wollte ich wissen, muss ich für jeden Nutzer anschließend mehrere Datenbanken anlegen mit z.B.

NutzerX/Freundschaftsanfragen

NutzerX/Freunde

NutzerX/BlockierteNutzer

NutzerY/Freundschaftsanfragen

NutzerY/Freunde

NutzerY/BlockierteNutzer

...

Hier wieder eine ähnliche Frage, wegen den Chatverläufen. Muss ich dann für eine Conversation zweier Nutzer X und Y immer eine Seperate datenbank anlegen

Conversation / X Y

Nachricht1 / Sender/ Empfänger

Nachricht2 / Sender / Empfänger

....

Conversation / X Z

Nachricht1 / Sender/ Empfänger

Nachricht2 / Sender / Empfänger

....

Okey ich werde mich morgen direkt an deine Tipps setzten und schauen ob ich es in solch einer Art umgesetzt bekomme. Vielen Dank!

0
regex9  21.08.2022, 22:25
@Krammer456
Ich hashe die Passwörter mit sha256, damit sie nicht im Klartext vorliegen.

PHP hat zwei Funktionen: password_hash und password_verify. Die vereinfachen nicht nur den Prozess, sondern nutzen auch einen aufwänderigen Hashalgorithmus.

(...) muss ich für jeden Nutzer anschließend mehrere Datenbanken anlegen mit z.B. (...)

Wenn die Daten zentral beim Server gespeichert werden sollen, dann reicht eine Datenbank aus. In die kommen die Nutzerdaten, die Kontaktdaten, die Nachrichten, etc. von jedem Nutzer.

Wenn die Daten dezentriert gespeichert werden sollen, hättest du folglicherweise bei jedem Nutzer eine Datenbank (SQLite würde sich anbieten) oder verschiedene Dateien, in der seine Kontaktdaten und Nachrichten gespeichert sind.

1