it-swarm.com.de

Rollenanspruch (oder einen anderen Anspruch) in JWT aktualisieren/ändern

Ich speichere Benutzerrollen in einer JWT (um API-Endpunkte einzuschränken). Die Rollen können von einem Administrator geändert werden.

Wenn eine Rolle geändert wird. Wie soll ich das in allen Spielmarken spiegeln? Ich habe über ein paar Lösungen nachgedacht:

  • Wenn ich Aktualisierungstoken verwenden würde, müsste der Benutzer warten, bis das Ablaufdatum des Zugriffstokens abgelaufen ist.

  • Ich könnte geänderte Benutzer-IDs protokollieren, jede Anforderung überprüfen und dann ein neues Token zurückgeben, wenn der Benutzer geändert wurde.

Gibt es einen Standardweg, um dies zu tun?

14
tobbe

Aktualisierungs-Token scheinen keine Lösung zu sein, wenn Sie sich darum kümmern, dass die Änderungen sofort vorgenommen werden. Wahrscheinlich möchten Sie nicht, dass ein Benutzer für einige Zeit auf Moderationstools zugreift, wenn Sie seine Berechtigungen widerrufen.

Sie könnten eine Versionsnummer im jwt-Token relativ zum Benutzer beibehalten, ähnlich wie mongoose es mit versionKey tut. Auf diese Weise können Sie diese Version mit der Version in der Datenbank für einen bestimmten Benutzer vergleichen. Jedes Mal, wenn Sie die Rollen dieses Benutzers ändern, würden Sie diese Version inkrementieren. Wenn die Version von jwt nicht übereinstimmt, erstellen Sie einfach eine neue mit den richtigen Rollen und Version und senden Sie sie an den Benutzer zurück.

Ich glaube nicht, dass es dafür einen geeigneten Standard gibt, da jwt vom Design aus unveränderlich ist, müssen Sie ihn vollständig ändern, wenn Sie ihn "aktualisieren" müssen.

6
Balthazar

Die JWT-Token sind unveränderlich. Sie können also keine Ansprüche für ein vorhandenes Token ändern/aktualisieren. Daher müssen Sie ein neues JWT-Token ausstellen.

Dies führt zu dem größten Problem mit dem Widerruf von JWT - Token. Es gibt keine guten Lösungen. Was können Sie tun?

  • JWT-Ablaufdatum kurz halten (und optional Aktualisierungstoken verwenden)

  • Verwenden Sie eine Blacklist, um eine Liste der widerrufenen Token zu führen (natürlich verlieren Sie den 'statuslosen' Teil auf diese Weise).

  • Ändern Sie den geheimen Schlüssel (beachten Sie, dass dies ALLE gültigen Token aller Benutzer widerruft).

Die beste Lösung hängt vom konkreten Fall ab.

8
Janar

Um diesem Szenario zu begegnen, können Sie die Lebensdauer des Token kurz halten. Nach Ablauf des Token können Sie das Token im Falle einer impliziten Erteilung unbeaufsichtigt erneuern oder den Tokenmechanismus zum Aktualisieren verwenden, um ein neues Token vom Autorisierungsserver auszustellen. Sobald sich die Rolle geändert hat, wird sie möglicherweise nicht sofort im Token wiedergegeben. Sie ist jedoch verfügbar, sobald das Token erneuert wird. 

0
Tanver Hasan

@Janar sagte drei Lösungen, um verschiedene Szenarien zu handhaben, aber es gibt immer noch entsprechende Nachteile.

Ich habe auch eine Idee, Ihr Token zu widerrufen:

  1. legen Sie iatauf JWT-Nutzdaten fest. (Sie sollten wissen, was der iatist)
  2. token eines Benutzers widerrufen:
    • finden Sie die Benutzer-ID
    • auth server lehnt Token ab, die vor dem aktuellen Zeitpunkt liegen (von iat beurteilt) und diesem Benutzer gehören (beurteilt nach userId)
0
Dcalsky