it-swarm.com.de

Wie können Benutzer von mehreren Geräten aus mit Aktualisierungstoken eine Verbindung herstellen?

Diese Frage folgt meiner vorherigen: Wie kann ich meine Benutzer mit Aktualisierungstoken sicher anmelden?

Was ich aus dieser vorherigen Frage erhalten habe, ist, dass wir brauchen:

  • kurzlebige Zugangstoken
  • langlebige einmalige Aktualisierungstoken

Aktualisierungstoken werden in der Datenbank zusammen mit Benutzern in einer 1-1-Beziehung beibehalten (1 Benutzer = 1 Aktualisierungstoken). Jedes Mal, wenn ein Aktualisierungstoken für einen Benutzer erstellt wird, ersetzt es das beibehaltene Token des vorherigen Benutzers (falls vorhanden). Dies ermöglicht möglichen Hackern, nur ein begrenztes Fenster zu haben, um ihre Sachen zu erledigen:

  • benutzer meldet sich an und erhält Zugriffstoken A1 und Token aktualisieren R1
  • hacker schafft es irgendwie, diese Token zu bekommen
  • zugangstoken A1 erreicht das Ablaufdatum, sodass der Hacker neue Zugriffs-/Aktualisierungstoken erhält A2/R2 dank des gestohlenen Aktualisierungstokens R1: neu erstelltes Aktualisierungstoken R2 (das nur der Hacker hat) ersetzt das vorherige R1 in DB (die, die der Benutzer hat)
  • benutzer erhält kein neues Zugriffstoken, weil sein Aktualisierungstoken R1 existiert nicht mehr, also melde dich erneut an und erhalte neue Zugriffs-/Aktualisierungstoken A3/R3: neu erstelltes Aktualisierungstoken R3 (das nur der Benutzer hat) ersetzt das vorherige R2 in DB (der, den der Hacker hat)
  • hacker-Zugriffstoken A2 läuft ab, kann aber kein neues erhalten, da das Aktualisierungstoken R2 existiert nicht mehr: muss die Token erneut stehlen (sollte natürlich schwierig sein)

Ich frage mich hier, wie ein Benutzer mit diesem Mechanismus eine Verbindung von mehreren Geräten aus herstellen kann. Wenn sich ein Benutzer beispielsweise mit zwei verschiedenen Laptops anmeldet, werden sich die Aktualisierungstoken immer gegenseitig löschen ... Gibt es einen Hinweis?

8
sp00m

Meiner Meinung nach geht es bei der Frage, die Sie jetzt stellen, nicht mehr wirklich um Sicherheit, sondern vielmehr um die Umsetzung eines Konzepts. Sie haben bereits festgestellt, dass Aktualisierungstoken es Angreifern erschweren, und es scheint, als hätten Sie eine funktionierende Implementierung. Nach dem, was Sie beschreiben, verwenden Sie eine benutzerdefinierte Lösung und nicht so etwas wie eine OAuth2-Bibliotheksimplementierung, die Ihnen diese Funktionalität bietet.

Jetzt müssen Sie entscheiden, ob Sie mehrere Geräteauthentifizierungen von demselben Benutzerkonto aus wünschen. Wenn Sie nicht möchten, dass sich Benutzer von mehreren Geräten in einem Konto aus anmelden, herzlichen Glückwunsch, Ihre Lösung funktioniert bereits. Sie werden bald vom alten Gerät abgemeldet, da es nach einer Zeitüberschreitung nicht das richtige Aktualisierungstoken enthält.

Wenn Sie Benutzern die Möglichkeit geben möchten, sich von mehr als einem Gerät im selben Konto aus anzumelden, müssen Sie leider einige Änderungen vornehmen. Eine mögliche Lösung besteht darin, ein Geräteidentifikationsfeld in Ihre Datenbank einzufügen und ein Aktualisierungstoken pro Gerät auszustellen.

5
Joe

Ich stimme Joes Antwort zu

Eine mögliche Lösung besteht darin, ein Geräteidentifikationsfeld in Ihre Datenbank einzufügen und ein Aktualisierungstoken pro Gerät auszustellen.

ich möchte jedoch einige Implementierungsdetails hinzufügen.

IMO ist die robusteste und funktionalste Lösung: Jeder Benutzer muss viele Datensätze in der Datenbank mit jeweils drei Spalten haben: access_token, refresh_token und device_id.

Untersuchen wir die Hauptfälle:

  • Benutzeranmeldung . Er schafft es natürlich mit Hilfe des Passworts. Er übergibt device_id (eine eindeutige Nummer, tatsächlich). Wenn das Kennwort korrekt ist, generiert der Server ein neues Zugriffs- und Aktualisierungstoken und fügt es zusammen mit device_id in die Datenbank ein.
  • Benutzer nutzt den Dienst . Er sendet access_token (der Benutzer muss natürlich intern den Benutzer verschlüsseln. Zum Beispiel sein Login). Der Server prüft, ob ein solches access_token für eine solche Anmeldung in der Datenbank angezeigt wird. Wenn ja - Zugriff gewähren. Wenn das Zugriffstoken abgelaufen ist, kann der Benutzer es mit Hilfe des entsprechenden refresh_token und der (wichtigen!) Geräte-ID aktualisieren. Wenn refresh_token in der Datenbank nicht dem Token des Benutzers entspricht, werden wir gehackt. Aber keine Panik - wir löschen einfach diesen Zugriff und aktualisieren das Token und leiten den Benutzer zur Anmeldeseite um! Das war's, Hacker haben keinen Zugang mehr!
  • Benutzerabmeldung. Er sendet sein Zugriffstoken und die Datenbank löscht es und das entsprechende refresh_token aus der Liste. (Wir möchten keine veralteten, nicht verwendeten Token sammeln.)
  • Benutzerpasswort geändert. Der Server löscht alle vorherigen Token. Wenn der Benutzer auf unbefugten Zugriff stößt, kann er den Pass ändern und alle Schlüssel sofort widerrufen. Mit selbstcodierten Token ist dies nicht möglich, da wir warten müssen, bis die Token abgelaufen sind. Mit einer solchen Lösung ist es auch sehr einfach, die Funktion "Abmelden von allen Geräten" zu implementieren.
  • Hacker stehlen access_token und Benutzer wissen nichts davon . Hacker können es nur verwenden, bis es abläuft (kurzer Zeitrahmen).
  • Hacker stehlen auch refresh_token und machen refresh . Der Benutzer kann sein altes refresh_token nicht verwenden. In diesem Fall wird er aufgefordert, sich erneut anzumelden. Es wird eine neue Aktualisierung und ein neues Zugriffstoken generiert. Der Hacker hat den Zugriff verloren. (siehe Fall 2)

Das einzige, was Sie klar verstehen sollten: Aktualisierungstoken können Sie nur für den Fall retten, dass Hacker Zugriffs-/Aktualisierungstoken stehlen, aber nicht das echte Passwort! Denn wenn er den Pass erhält, sind Sie in Schwierigkeiten und müssen das Protokoll zum Wiederherstellen des Passworts implementieren (z. B. mithilfe von E-Mail oder SMS).

PS: Es ist eine gute Idee, ein refresh_token zu haben, das ebenfalls ablaufen kann. Um zu verhindern, dass Jacker veralteten Zugriff und Ref-Token von einem alten Gerät, das Sie jetzt nie verwenden.

P.P.S Es wäre perfekt, eine periodische Datenbankaufgabe zu haben, die Zeilen mit abgelaufenem refresh_token bereinigt (pehaps müssen Sie dafür die Spalte refresh_tocken_expiration_date hinzufügen).

P.P.P.S. Ich bin kein Sicherheitsexperte. Wenn Sie also der Meinung sind, dass es eine bessere Lösung gibt, würde ich mich über eine Diskussion freuen.

Vielen Dank fürs Lesen, hoffe das hilft)

2
DmitriyS