Angenommen, 100% TLS für die gesamte Kommunikation - sowohl während als auch zu jeder Zeit nach der Anmeldung - ist die Authentifizierung mit Benutzername/Passwort über die Standardauthentifizierung und das Empfangen einer JWT im Austausch ein gültiger Anwendungsfall. Dies ist fast genau wie einer der OAuth 2's fließt ("Passwort gewähren").
Die Idee ist, dass der Endbenutzer über einen Endpunkt authentifiziert wird, z. /login/token
Verwenden Sie den gewünschten Mechanismus, und die Antwort sollte die JWT enthalten, die bei allen nachfolgenden Anforderungen zurückgesendet werden soll. Der JWT sollte ein JWS (d. H. Ein kryptografisch signierter JWT) mit einem geeigneten JWT-Ablaufdatum (exp
) -Feld sein: Dies stellt sicher, dass der Client den JWT nicht manipulieren oder länger leben kann, als er sollte.
Sie benötigen einen nicht X-Auth-Token
Header entweder: das HTTP-Authentifizierung Bearer
Schema für diesen genauen Anwendungsfall erstellt wurde: im Grunde jede Menge an Informationen, die den Bearer
Schema Namen Trails ist ‚Träger‘ Informationen, die validiert werden sollen. Sie setzen einfach den Authorization
Header:
Authorization: Bearer <JWT value here>
Aber, was gesagt wird, wenn Ihr REST-Client ‚nicht vertrauenswürdigen‘ (zB JavaScript-fähigen Browser) ist, würde ich nicht einmal das tun: einen beliebigen Wert in der HTTP-Antwort das über JavaScript zugänglich ist - im Prinzip jeder Header-Wert oder Response-Body-Wert - könnte über MITS XSS-Attacken abgefangen und abgefangen werden.
Es ist besser, den JWT-Wert in einem sicheren Nur-HTTP-Cookie zu speichern (Cookie-Konfiguration: setSecure (true), setHttpOnly (true)). Dies garantiert, dass der Browser:
- immer nur das Cookie über eine TLS-Verbindung übertragen und
- nie den Cookie-Wert zu JavaScript-Code zur Verfügung stellen.
Dieser Ansatz ist fast alles, was Sie für Best Practices Sicherheit tun müssen. Als letztes müssen Sie sicherstellen, dass Sie bei jeder HTTP-Anforderung CSRF-Schutz haben, um sicherzustellen, dass externe Domänen, die Anforderungen an Ihre Site initiieren, nicht funktionieren können.
Der einfachste Weg, dies zu tun, ist eine sichere nur (aber nicht http nur) Cookie mit einem zufälligen Wert, z. eine UUID
Stellen Sie dann bei jeder Anfrage in Ihrem Server sicher, dass Ihr eigener JavaScript-Code den Cookie-Wert liest und in einer benutzerdefinierten Kopfzeile, z. X-CSRF-Token und überprüfen Sie diesen Wert bei jeder Anfrage auf dem Server. Externe Domänenclients können keine benutzerdefinierten Header für Anforderungen an Ihre Domäne festlegen, es sei denn, der externe Client erhält die Autorisierung über eine HTTP-Optionsanforderung, so dass jeder Versuch eines CSRF-Angriffs (z. B. in einem IFrame) fehlschlägt.
Dies ist die beste Sicherheitsleistung für nicht vertrauenswürdige JavaScript-Clients im Internet, die wir kennen. Stormpath schrieb einen Artikel auf these techniques auch wenn Sie neugierig sind.
Schließlich ist die Stormpath Java Servlet Pluginbereits tut alles für Dich (und viel mehr coole Sachen, einschließlich zusätzlichen automatisierten Sicherheitskontrollen), so dass Sie immer noch nicht schreiben müssen - oder noch schlimmer - sie selbst halten. Sehen Sie sich das HTTP Request Authentication section und das Form/Ajax-Beispiel an, um zu sehen, wie Sie es verwenden können. HTH!
Wie wird das Token in nachfolgenden Anfragen an den Server gesendet? (HTTP Header? Cookie?). Verwenden Sie auch TLS (SSL)? –
Hallo Les, schön dich wiederzusehen! Ja, das Token wird als X-Auth-Token-Header gesendet. Ich benutze auch TLS. Ist TLS bei Verwendung eines JWT obligatorisch? – Stephane
Hallo Stephane! :) Wenn der JWT eine verifizierte Identität darstellt, würde ich TLS als zwingend betrachten, ansonsten ist es (viel) einfacher für MITM-Angriffe. –