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 aufAuthenticationMethod
s - Jeder
AuthenticationMethod
hat genau einenAuthenticationProvider
(zBgoogle
,github
,local
) und speichert diesub
dieser Authentifizierungsmethode und der entsprechendenUser
. Im Falle einer lokalen Authentifizierung ist dies die Benutzer-ID. - Jede
AuthenticationMethod
mitAuthenticationProvider == 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?
Problem ist: Ich kann die externen Zugriffsmarken nicht ändern, daher kann ich keine weiteren Ansprüche hinzufügen. – Turing85
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
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