Unternehmensmuster für die JWT-Authentifizierung für REST-basierte Anwendungen?

9

Die JWT-Spezifikation beschreibt nur die Nutzdaten und wie sie gesendet werden, lässt jedoch das Authentifizierungsprotokoll offen, was die Flexibilität ermöglicht, aber leider kann Flexibilität zu Antimustern und falschem Design führen.

Ich bin auf der Suche nach gut durchdachten und getesteten Unternehmensmustern für die JWT-Authentifizierung, die ich verwenden oder anpassen kann, aber ich habe nichts Vollständiges gefunden.

Was ich dachte ist:

  • Wenn kein Autorisierungsheader erfüllt ist oder das JWT-Token ungültig oder abgelaufen ist, senden Sie HTTP 401
  • Verwenden Sie zur Authentifizierung den REST-Kanal und melden Sie sich an. Senden Sie den Benutzernamen und das Kennwort als JSON-Objekt
  • Um das Token am Leben zu erhalten, verwenden Sie den REST-Kanal / halten Sie ihn aufrecht, rufen Sie ihn alle N (5) Minuten auf, empfangen Sie einen neuen JWT-Token und ersetzen Sie den vorhandenen nach jedem Aufruf (der Token läuft nach M (15) Minuten ab).

Was mich jedoch stört, ist die Notwendigkeit dieses / Keepalive-Kanals. Andererseits zwingt es mich, zu verhindern, dass die Authentifizierung abläuft, selbst wenn der Benutzer nicht anwesend ist (die Entscheidung, ob wir Keepalive wünschen, ist noch nicht erfüllt), und dies sind natürlich zusätzliche Anrufe und zusätzliche Komplikationen für das Protokoll. Interessant wäre, dass der Server das Token automatisch verlängert. In einer sitzungsbasierten Umgebung geschieht dies durch Zurücksetzen des Zeitstempels. Hier müsste der Server jedoch möglicherweise nicht jedes Mal ein neues Token senden, aber sobald das Token in R (z. B. 10) Minuten abläuft. Das Platzieren im Antworttext würde jedoch bedeuten, das JSON-Antwortprotokoll zu ändern (daher ist die Lösung invasiv und nicht transparent), und das Einfügen eines zusätzlichen HTTP-Headers, den der Client verarbeiten könnte, könnte nicht unbedingt ein gutes Muster sein. ICH'

Gibt es fertige Unternehmensmuster, die meine offenen Punkte beantworten? Ist mein Protokollentwurf eine verlässliche Idee? Ich würde lieber etwas Fertiges verwenden als Design von Grund auf neu.


quelle
1
Ja. JWT hat viele Leute dazu gebracht, selbst entwickelte 'Protokolle' zu implementieren und bewährten Framework-Code beiseite zu werfen. Um die richtige Lösung zu finden, ist es wichtig, die Anforderungen klar zu definieren. Klingt so, als wäre der Ablauf einer Sitzung erforderlich. Ist eine erzwungene Abmeldung erforderlich? dh wo jemand auf der Serverseite sagen kann, diesen Benutzer abmelden oder ein Benutzer kann sagen, alle meine Sitzungen abmelden.
Joshp

Antworten:

4

JWT ( Intro to JSON Web Token ) ist nur ein Token-Format. Die Authentifizierung liegt für diese Spezifikation völlig außerhalb des Anwendungsbereichs. Es wird zwar häufig in Authentifizierungssystemen verwendet, Sie können es jedoch auch für völlig andere Szenarien verwenden. Daher ist es sinnvoll, authentifizierungsspezifische Einschränkungen nicht in diese Spezifikation aufzunehmen.

Wenn Sie nach Anleitungen zur Authentifizierung suchen, lesen Sie die OpenID Connect- Spezifikationsfamilie. Wenn Ihr System aus HTTP-APIs besteht und Sie einen delegierten Zugriff auf diese API für Ihre eigene oder für Clientanwendungen von Drittanbietern bereitstellen möchten, sollten Sie sich außerdem auf die OAuth 2.0- Spezifikation beziehen .

Es gibt zusätzliche authentifizierungsbezogene Protokolle wie SAML und WS-Federation, die in Unternehmensszenarien immer noch weit verbreitet sind, deren Implementierung jedoch erheblich komplexer ist.

Über Ihre spezifischen offenen Punkte:

  • Das Bearer-Token-Authentifizierungsschema ist in RFC 6750 definiert, das Anweisungen zum Ausführen von Anforderungen und mögliche Fehlercodes enthält .
  • OAuth2 und OpenID Connect erwägen beide die Möglichkeit und definieren die Art und Weise, wie ein Benutzername / Passwort mit einem Token ausgetauscht werden kann.
  • Das Problem der Verlängerung der Lebensdauer eines eigenständigen / nach Wert-Tokens (JWT) wird in OpenID Connect und OAuth2 mithilfe von Aktualisierungstoken behoben .

Obwohl OAuth2 und OpenID Connect als einfacher zu implementieren angesehen werden können als einige seiner Vorgänger, sind sie dennoch so komplex, dass Vorsicht geboten ist, und sie können nur dann selbst implementiert werden, wenn Sie bereit sind, viel Zeit und Ressourcen aufzuwenden. Im Allgemeinen ist es eine bessere Option, Bibliotheken oder Dienste von Drittanbietern zu verwenden, die diese Schwerarbeit für Sie erledigen.

Schließlich decken diese Protokolle viele Szenarien ab, sodass sie in einigen Situationen möglicherweise übertrieben sind.

João Angelo
quelle
2
+1 für die Gewährleistung von Vorsicht und eine vollständige Antwort auf die implizite Frage anstatt auf die schriftliche.
Paul
3

Ich glaube nicht, dass du einen Keepalive-Kanal brauchst. Ihre Nutzdaten können (und werden empfohlen) Ablaufinformationen enthalten, die vom Server (im expSchlüssel gemäß Standard ) bereitgestellt werden , wenn das Token bei der Anmeldung generiert wird. Wenn ein abgelaufenes Token verwendet wird (was offensichtlich vom Server bestimmt wird, der nur dann vertraut, was im Token enthalten ist, wenn die Signatur überprüft wird), lehnt der Server es einfach mit HTTP 401 ab und fordert den Client zur erneuten Authentifizierung auf.

Kunden können unterdessen proaktiv sein. Der Payload-Abschnitt ist nicht verschlüsselt, und da der Client ihn lesen kann, kann der Client feststellen, wann eine Anforderung mit einem abgelaufenen Token gesendet wird, und daher /loginerneut aufrufen , wenn das Token abgelaufen ist.

Alternativ können Sie mit REST Hypermedia-Informationen als "Engine of State" senden. Wenn Sie möchten, können Sie die JWT also nur einmal verwenden und auch mit Ablauf. Jede Anfrage würde dann eine neue JWT erzeugen, die in der Antwort an den Client zurückgegeben wird, entweder im Inhalt oder wahrscheinlicher in einem Antwortheader , wie es hapi-auth-jwt2 tut.

Paul
quelle