### Interne Schnittstellen

Zwischen den einzelnen Modulen gibt es interne Schnittstellen, damit diese kommunizieren können.
Zwischen Datenbank und Server wird dies über die verwendete Bibliothek geregelt und muss daher nicht
weiter berücksichtigt werden. Zwischen FIDO Key und Web-Oberfläche wird das hauptsächlich vom
Browser übernommen. Übrig bleibt nur noch die Schnittstelle zwischen dem Server und der
Web-Oberfläche. Hierfür gibt es die Bedingung, dass die Schnittstelle über einen herkömmlichen
Browser erreichbar, leicht erweiterbar und leicht verständlich sein soll.

Für den Großteil der Kommunikation wird eine WebSocket-Schnittstelle gewählt. Dazu wird ein
Nachrichtentunnel zwischen Oberfläche und Server aufgebaut, in denen verschiedene JSON-formartierte
Nachrichtenpakete hin und her verschickt werden können. Dieses Protokoll ist nicht Zustandsbasiert
und die Kommunikation kann in beide Richtungen jederzeit erfolgen. Weiterhin ist der Tunnel zwischen
beiden Teilnehmern sicher. Es kann sich keine dritte Partei (wenn hier der WebBrowser außen vor
gelassen wird) einmischen und zur Laufzeit der Verbindung, was meist über die gesamte Dauer der
Ausführung der Anwendung hinweg geht, sind beide Teilnehmer immer authentifiziert.

Über diese WebSocket-Schnittstelle werden so gut wie alle Nachrichten übermittelt. Das hat den
Vorteil, dass beide Seiten sofort auf Ereignisse reagieren können.

Des weiteren gibt es eine kleine REST-Schnittstelle. Hier werden über verschiedene URLs
hauptsächlich Dateien angeboten, da sie meist zu groß sind, um sie über WebSocket zu übertragen.
Damit wird versucht die Latenzen über WebSocket möglichst gering zu halten und wichtige Pakete
jederzeit den Vorrang geben zu könne.

Ein Problem besteht bei der REST-Schnittstelle, da bei jeden Aufruf eine neue Verbindung aufgebaut
wird. Dadurch ist eine Authentifizierung nicht durchgehend möglich. Dafür wird ein kurzlebiger
Authentifizierungstoken über die WebSocket-Schnittstelle mitgeteilt, den die Web-Oberfläche nutzen
kann, um die REST Anfragen authentifizieren zu können.
