Wie sollten Sie mit der Authentifizierung und der Freigabe von Benutzerinformationen über Microservices umgehen?

8

TLTR: Was ist eine gute Möglichkeit, zwischen den Diensten für Auth und User Info unabhängig vom Standort des Servers oder der verwendeten Technologie zu kommunizieren

Ich versuche, etwas über Microservices zu lernen, und ich bin ein wenig unklar, wie ich Zugang zu Benutzerinformationen erhalten und den Zugriff mit mehreren Diensten steuern sollte. Bitte lassen Sie mich wissen, wenn ich mich dem völlig falsch annähere.

Zum Beispiel habe ich einen Basisdienst für Blog CRUD-Vorgänge und einen Dienst zum Hochladen und Speichern von Bildern und Videos. Ich habe noch nichts mit der Autorisierung oder den Benutzern gemacht (außer dass BenutzerIDs in meinen Modellen vorhanden sind (z. B. in meinem Blog-Modell ObjectIDs für Autor, Kommentatoren usw.).

Ich möchte das so getrennt wie möglich halten (zu Lernzwecken mehr als alles andere) und während ich im Moment alles in Node.js erstelle, hoffe ich, verschiedene Technologien wie nginx ein- und auslagern zu können. ein java / go / python-Dienst oder ein anderer Speicher (derzeit mongo, würde aber gerne zu sql als Option wechseln können)

Wie ich derzeit diese strukturiert habe, habe ich beide Dienste als Express.js Apps gebaut und derzeit benutze ich Knoten-http-Proxy, um die Express-Dienste zu proxy (das ist nur zu speichern mit der Einrichtung von nginx für jetzt, aber ich will auch nicht von nginx abhängig sein).

Wie soll ich mich nähern?

  • Authentifizierter Benutzer oder einige der Routen (z. B. beim Erstellen eines neuen Posts oder Aktualisieren / Löschen) und Nicht beim Abrufen des Posts zum Lesen (schließlich möchte ich auch Rollen integrieren)

  • Füllen der Benutzerinformationen z. von der Benutzer-ID, die im Blog-Autor gespeichert ist, und ersetze sie durch die Benutzerinformationen (in einer einzigen App könnte ich einfach mongoose populate

  • verwenden

Das Hauptziel ist, dass ich die Auth und die Benutzer in separaten Diensten halten möchte, die in jedem anderen Dienst aufgerufen und in einer anderen DB gespeichert werden könnten, wenn sie sich beispielsweise auf verschiedenen physischen Servern befinden.

jemand hat mir vorgeschlagen, dass ich dies mit HTTP / S tun könnte, aber gibt es einen besseren Weg, dies zu tun, und kann mich jemand auf irgendwelche Implementierungsbeispiele verweisen, wäre Node.js vorzuziehen, aber nicht notwendig

Dies erfordert wahrscheinlich einige Service-Registry, aber ich bin ein bisschen verloren, wie dies implementiert werden würde

    
jonnie 09.07.2015, 12:26
quelle

1 Antwort

4

Eine Authentifizierungsschicht als eigene Anwendung passt ziemlich gut in SOA-Design. Es gibt einen HTTP-Endpunkt ohne direkten Zugriff auf die Micro-Service-Datenbank. Was ist SOA-Best Practice:

  

Serviceorientierung bedeutet für uns die Kapselung der Daten mit dem   Geschäftslogik, die mit den Daten arbeitet, mit dem einzigen Zugriff durch   eine veröffentlichte Service-Schnittstelle. Kein direkter Datenbankzugriff ist erlaubt   von außerhalb des Dienstes, und es gibt keinen Datenaustausch zwischen den   Dienstleistungen.

     

- Werner Vogels, CTO von Amazon

Verweis auf Ссылка

Was ist eine Authentifizierungsschicht oder ein Authentifizierungs-Layer und wie bestätigt ein Server die Authentifizierung? Eine Art von clientbasierter Persistenz ist ein HTTP-Cookie, der streng an einen Domainnamen angehängt ist. Daher ist es nicht einfach, dasselbe Cookie zwischen mehreren Domains ohne einen expliziten Authentifizierungsschritt wiederzuverwenden.

Wenn Sie einen bestimmten Schlüssel oder Header übergeben können Ссылка kann eine unauffällige Authentifizierung bieten, wurde dieses Modul seit Version 1.5.4 ein eingebauter Nginx-Kern: Ссылка

%Vor%

Der Endpunkt, auf den über Ссылка zugegriffen werden kann (wählen Sie Ihre eigene URL), ist isoliert und hat seine eigene Datenbank und macht nur eines - um Benutzer zu authentifizieren oder nicht . Ein Mechanismus kann sich auf einen bestimmten Schlüssel oder Header oder sogar IP-Adresse verlassen. Um zu viel nachfolgenden Anforderung zu unterdrücken, können Sie die Antwort zwischenspeichern.

SOA ist schwer, aber ich empfehle, dies gründlich zu lesen: Ссылка

    
Anatoly 09.07.2015, 14:53
quelle