2016-08-24 3 views
2

Ich habe einige Fragen zur Authentifizierung in einer Microservices-Architektur. Ich habe jetzt eine monolithische Anwendung und mein Ziel ist es, die Anwendung in kleine Microservices aufzuteilen.Client-Authentifizierung in Microservices mit JWT und OpenID Connect

Mein größtes Problem ist für die Authentifizierung (für jetzt). Nach dem Lesen einer LOT eine Dokumentation, Es scheint, dass die beste Lösung ist, OpenID Connect zu verwenden, um einen Benutzer zu authentifizieren, um eine JWT abzurufen, die mit der Anfrage an die Microservices übergeben werden kann.

Um zu vermeiden, mehrere Endpunkte zu haben, können Sie bereitstellen und API Gateway nur einen Endpunkt für den Endbenutzer haben. Ok, jetzt habe ich zwei Fragen zu dieser Architektur.

wird der Standardablauf für die Authentifizierung sein:

Ein Benutzer meiner Identitätsserver in OpenID Connect mit dem impliziten Fluss kontaktieren und die id_token (JWT) und auch die access_token bekommen. Der Benutzer kann jetzt meine API mit diesem access_token kontaktieren. Das API-Gateway validiert das access_token mit dem Identitätsserver und ruft auch das JWT ab, um es der Unteranfrage an die Microservice-API hinzuzufügen.

1/Wie kann das API Gateway die JWT vom access_token bekommen? Von dem, was ich rot aus der Dokumentation (http://openid.net/specs/openid-connect-core-1_0.html), kann es den Endpunkt "/ Benutzerinfo" kontaktieren, aber es wird nur das JSON-Format nicht die JWT ...

2/Ich möchte authentifizierte Anrufe zwischen meinen Microservices erlauben. Jeder Microservice muss also in der Lage sein, ein JWT zu generieren, um direkt mit anderen Microservices in Kontakt zu treten. Mein erster Gedanke war, den Identitätsserver zu kontaktieren. Mit dem OAuth2 Client Credentials-Flow erhalte ich jedoch kein id_token oder eine JWT. Einfach ein klassisches OAuth2 Access Token ohne JWT. Mein zweiter Gedanke war, dass der Microservice seine eigene JWT direkt mit einem Zertifikat signieren kann, das von der gleichen PKI wie die vom Identity Server herausgegeben wird. Das bedeutet, dass ein JWT von mehreren Zertifikaten signiert werden kann, aber von derselben privaten PKI. Wenn ein Microservice ein JWT erhält, muss er in der Lage sein zu erkennen, welches Zertifikat zum Signieren des JWT verwendet wurde. Ich finde nichts in der RFC zu diesem Problem. Ich kann meinen eigenen privaten Anspruch im Token hinzufügen, um das Zertifikat zu haben, aber nach einigen Tagen im Internet zu surfen, ohne diese Art von Lösung zu sehen, frage ich mich, ob ich nicht auf dem falschen Weg bin ... Zusammenfassend, wie Kann ich die "User to service" -Authentifizierung durchführen und die "service to service" -Authentifizierung in JWT durchführen?

Vielen Dank!

Antwort

3

Ich implementiere eine ähnliche Lösung. Nicht sicher, ob es vollständig auf Ihre Frage wird sich, aber ich hoffe, es hilft:

  1. Sie einen neuen Authentifizierungs Mikro-Dienst implementieren können Ihre OAuth2 Zugriffstoken JWT Token zu konvertieren. Dieser Microservice wird dieses JWT-Token auch signieren.

  2. Ihr API-Gateway leitet alle Clientanforderungen an den Authentifizierungsdienst weiter, der dieses Token von IDM validiert und in ein signiertes JWT-Token konvertiert.

  3. Das API-Gateway leitet dieses JWT-Token an andere Microservices weiter, die die Signatur aus dem öffentlichen Schlüssel des Authentifizierungsdiensts validieren. Wenn die Signatur validiert wird, können Rollen zur Autorisierung daraus extrahiert werden.

  4. Jeder Microservice kann seine eigenen IDM-Credentials konfiguriert haben und wenn er einen anderen Microservice anrufen möchte, kann er ein Access-Token generieren und den Authentication Service aufrufen, um JWT zu erhalten, der an andere Microservices weitergeleitet werden kann.