2017-10-02 2 views
0

Ich entwickle derzeit einen Webdienst mit Spring. Ich möchte Benutzern die Möglichkeit geben, sich über externe OAuth-Dienste, z. google, github, ... sowie ein traditioneller Benutzername/Passwort-Login. Pojo-weise, ich habe folgendes Setup:Spring OAuth2 + JWT, wie externe Zugriffstoken lokalen Benutzer zugeordnet werden

  • Jeder User hat eine Eins-zu-Viele Bezug auf AuthenticationMethod s
  • Jeder AuthenticationMethod hat genau einen AuthenticationProvider (zB google, github, local) und speichert die sub dieser Authentifizierungsmethode und der entsprechenden User. Im Falle einer lokalen Authentifizierung ist dies die Benutzer-ID.
  • Jede AuthenticationMethod mit AuthenticationProvider == local speichert zusätzlich ein Passwort.

Was bereits arbeitet

Lokale Authentifizierung (Benutzername/Passwort) über einen eigenen OAuth2 Authentifizierungsserver (Teil der Frühjahrsapplikation) durchgeführt wird, und gibt ein JWTAccessToken, den Benutzernamen, die (das Frontend nie sieht die client_secret, also eine password Gewährung ist in dieser Situation zulässig).

Ich bin auch in der Lage, Zugriff Token von den externen OAuth Provider (Google, Github, ...) über die authorization_request Erteilungsverfahren mit ihrem Benutzer sup von diesem Anbieter abrufen.

Problem

Ich brauche die externe sub zu einem User Objekt abzubilden. Da theoretisch zwei verschiedene Benutzer bei zwei verschiedenen externen Providern denselben sub haben könnten, müsste ich auch den Aussteller überprüfen, was zu einem ekligen if-else Konstrukt führt. Außerdem muss diese Übersetzung vom JWT-Token in einen User mit jedem Zugriff durchgeführt werden, für den eine Autorisierung erforderlich ist.

Ideen für Lösungen

Was würde ich tun gerne Informationen zu den extern erzeugten JWT hinzuzufügen. Dies ist natürlich nicht möglich, da ich das externe JWT nicht "neu signieren" kann. Meine Idee ist es, das externe JWT abzufangen und ein lokales JWT mit dem Benutzernamen herauszugeben, wobei das externe JWT nur für die anfängliche Authentifizierung verwendet wird.

Gibt es eine eingebaute Möglichkeit im Frühling, um zu erreichen, was ich will? Oder gibt es eine "Best-Practice", um dieses Problem zu lösen?

Antwort

0

Die beste Vorgehensweise besteht darin, dass der OAuth2-Server den Benutzernamen als zusätzlichen Anspruch an JWT hinzufügt. Spring hat bereits ein Handle, das den Anspruch "user_name" von JWT übernimmt und als Principal-Objekt verwendet.

+0

Problem ist: Ich kann die externen Zugriffsmarken nicht ändern, daher kann ich keine weiteren Ansprüche hinzufügen. – Turing85

+0

Ich glaube nicht, dass Spring etwas eingebaut hat, um in Ihrem Fall zu helfen. Haben Sie das JWT-Token von den OAuth2-Servern überprüft? Vielleicht haben sie weitere Ansprüche, mit denen Sie den Benutzernamen abrufen können. – tsolakp

+0

Die Token sind nicht das Problem. Ich kann einen 'Benutzer' finden, der einem Token entspricht. Problem ist die Token-Überwachung. Ich möchte nicht, dass das Frontend das externe Token sieht. – Turing85

Verwandte Themen