Ich habe ein Basis-Authentifizierungssystem mit Spring Boot, Spring Security, OAUTH2 und JWT als Auth-Token implementiert. Es funktioniert gut, aber ich dachte, wenn es sinnvoll ist, JWT in einer Datenbank zu speichern und zu überprüfen, ob ein Token jedes Mal existiert, wenn jemand eine authentifizierte Anfrage verwendet, die es benutzt? Ich habe speziell an das folgende Szenario gedacht: Benutzer wird auf einem mobilen Gerät authentifiziert und verliert sie, sodass sie dieses Gerät deaktivieren möchten. Sie könnten dann eine Operation ausführen, die die an ihre Benutzer-ID ausgegebenen Token löscht und alle ihm zugewiesenen Token deaktiviert. Irgendein anderer Weg? Denke ich, dass das falsch ist oder Dinge zu kompliziert machen?
Dies dient zum Sichern einer REST-API, die von einer mobilen APP aufgerufen wird.
Sie könnten den JWT in der db speichern, aber Sie verlieren einige der Vorteile eines JWT. Das JWT bietet Ihnen den Vorteil, dass Sie das Token nicht jedes Mal in einer Datenbank überprüfen müssen, da Sie mit Kryptografie nur überprüfen können, ob das Token legitim ist. Wenn Sie das Token in der Datenbank nachschlagen müssen, können Sie auch einfach ein undurchsichtiges Token verwenden, das keine Informationen enthält und der Server und die Datenbank Ihnen die Informationen zur Verfügung stellen. Auf der anderen Seite, wenn Sie ein Token in der Datenbank speichern werden, glaube ich nicht, dass eine JWT eine schlechte Wahl für Ihren Token-Typ ist. Wie Sie sagen, gibt es Vorteile für den Widerruf, wenn Sie Ihr Token in der Datenbank speichern. Alles hängt davon ab, was Sie erreichen möchten (schnellere Autorisierung, etc. gegen die Fähigkeit, bei Bedarf zu widerrufen).
Sie können JWT weiterhin mit OAuth2 verwenden, ohne Tokens in der Datenbank zu speichern, wenn Sie möchten. JWTs haben eine konfigurierbare Ablaufzeit, die Sie festlegen können - danach sind sie ungültig. Zugriffstoken (ob JWT oder nicht) sollten normalerweise aus Sicherheitsgründen kurzlebig sein. Wenn das Problem ist, dass jemandes Telefon gestohlen wird und Zugangstoken erhalten werden, denke ich, dass die Lösung darin besteht, dass diese Tokens schnell ablaufen (30 Minuten?). Wenn Sie oauth2 verwenden, ist es für den echten Eigentümer die Möglichkeit, den Client für mobile Apps auf dem Autorisierungsserver zu deaktivieren, sodass keine weiteren Zugriffstoken mehr ausgegeben werden, wenn Sie jemanden daran hindern, die App weiter zu verwenden.
Sie können das Ablaufdatum festlegen (für mobile 1 Woche).
Fügen Sie ein benutzerdefiniertes Feld refreshId
für den Benutzer hinzu (Sie können hierfür uuid verwenden).
Next set Ausgestellt am Claims-Parameter ("iat").
Speichern Sie refreshId
in db und legen Sie sie als claims-Parameter fest.
Jedes Mal, wenn Sie das Token validieren, sollten Sie das "Alter" des Tokens überprüfen. Wenn es älter als eine Stunde ist, sollten Sie Daten aus der Datenbank laden und refreshId
value überprüfen und ein neues Token mit dem aktuellen "iat" -Wert erstellen und an das mobile Gerät senden. Wenn Sie Token deaktivieren müssen, generieren Sie einfach einen neuen Wert für refreshId
in db. Nach einer Stunde sind alle Token inkorrekt, so dass sich der Benutzer erneut auf jedem Gerät anmelden muss. Sie können bei Bedarf eine benutzerdefinierte Lösung erstellen.