tl; dr: Das ist alles aus Sicherheitsgründen.
OAuth 2.0 wollte diese beiden Kriterien erfüllen:
- Sie möchten Entwicklern erlauben, Nicht-HTTPS-Umleitungs-URI zu verwenden, da nicht alle Entwickler über einen SSL-fähigen Server verfügen und dieser nicht immer ordnungsgemäß konfiguriert ist (nicht selbstsignierte, vertrauenswürdige SSL-Zertifikate, synchronisierte Serveruhr ...).
- Sie möchten nicht, dass Hacker Zugriffs- / Aktualisierungstoken stehlen können, indem sie Anforderungen abfangen.
Details unten:
Der implizite Ablauf ist aus Sicherheitsgründen nur in einer Browserumgebung möglich:
Im impliziten Ablauf wird das Zugriffstoken direkt als Hash-Fragment übergeben (nicht als URL-Parameter). Eine wichtige Sache beim Hash-Fragment ist, dass, sobald Sie einem Link folgen, der ein Hash-Fragment enthält, nur der Browser das Hash-Fragment kennt. Browser übergeben das Hash-Fragment direkt an die Zielwebseite (den Umleitungs-URI / die Webseite des Clients). Hash-Fragmente haben folgende Eigenschaften:
- Sie sind nicht Teil der HTTP-Anforderung, können daher nicht von Servern gelesen werden und können daher nicht von zwischengeschalteten Servern / Routern abgefangen werden (dies ist wichtig).
- Sie sind nur im Browser - auf der Clientseite - vorhanden. Die einzige Möglichkeit, das Hash-Fragment zu lesen, ist die Verwendung von JavaScript, das auf der Seite ausgeführt wird.
Auf diese Weise kann ein Zugriffstoken direkt an den Client übergeben werden, ohne dass das Risiko besteht, dass es von einem zwischengeschalteten Server abgefangen wird. Dies hat den Vorbehalt, nur clientseitig möglich zu sein, und benötigt Javascript, das clientseitig ausgeführt wird, um das Zugriffstoken zu verwenden.
Der implizite Datenfluss weist auch Sicherheitsprobleme auf, für deren Umgehung / Vermeidung beispielsweise weitere Logik erforderlich ist:
- Ein Angreifer kann von einem Benutzer auf einer anderen Website / App ein Zugriffstoken erhalten (z. B. wenn er der Eigentümer der anderen Website / App ist), das Token auf seiner Website protokollieren und es dann als URL-Parameter auf Ihrer Website übergeben Identitätswechsel mit dem Benutzer auf Ihrer Website. Um dies zu vermeiden, müssen Sie die mit dem Zugriffstoken verknüpfte Client-ID überprüfen (z. B. für Google können Sie den Tokeninfo-Endpunkt verwenden), um sicherzustellen, dass dem Token Ihre eigene Client-ID (dh von Ihrer eigenen App) ausgestellt wurde, oder die Signatur überprüfen Wenn Sie ein IDToken verwenden (dies erfordert jedoch Ihr Kundengeheimnis).
- Wenn die Authentifizierungsanforderung nicht von Ihrer eigenen Eigenschaft stammt (sogenannte Session Fixation-Angriffe), sollten Sie einen zufälligen Hash von Ihrer Website generieren, ihn in einem Cookie speichern und denselben Hash im Status-URL-Parameter von übergeben Wenn der Benutzer zurückkommt, überprüfen Sie bei der Authentifizierungsanforderung den Statusparameter mit dem Cookie und er muss übereinstimmen.
Im Autorisierungscode-Fluss ist es nicht möglich, ein Zugriffstoken direkt in einem URL-Parameter zu übergeben, da URL-Parameter Teil der HTTP-Anforderung sind. Daher können alle zwischengeschalteten Server / Router, an denen Ihre Anforderung übergeben werden könnte (möglicherweise Hunderte), dies tun Lesen Sie das Zugriffstoken, wenn Sie keine verschlüsselte Verbindung (HTTPS) verwenden, die sogenannte Man-in-the-Middle-Angriffe zulässt.
Das direkte Übergeben des Zugriffstokens an einen URL-Parameter könnte theoretisch möglich sein, aber der Authentifizierungs-Server müsste sicherstellen, dass der Umleitungs-URI HTTPS mit TLS-Verschlüsselung und einem "vertrauenswürdigen" SSL-Zertifikat verwendet (normalerweise von einer Zertifizierungsstelle, die nicht kostenlos ist). um sicherzustellen, dass der Zielserver legitim ist und die HTTP-Anforderung vollständig verschlüsselt ist. Wenn alle Entwickler ein SSL-Zertifikat erwerben und SSL in ihrer Domain ordnungsgemäß konfigurieren, wäre dies ein großer Schmerz und würde die Akzeptanz enorm verlangsamen. Aus diesem Grund wird ein einmaliger "Autorisierungscode" für die einmalige Verwendung bereitgestellt, den nur der legitime Empfänger austauschen kann (da Sie das Client-Geheimnis benötigen) und der Code für potenzielle Hacker, die die Anforderungen über unverschlüsselte Transaktionen abfangen, unbrauchbar ist (weil sie nicht '
Sie könnten auch argumentieren, dass der implizite Fluss weniger sicher ist. Es gibt potenzielle Angriffsmethoden wie das Spoofing der Domain bei der Umleitung - beispielsweise durch die Entführung der IP-Adresse der Client-Website. Dies ist einer der Gründe, warum der implizite Datenfluss nur Zugriffstoken (die nur eine begrenzte Zeit verwenden sollen) gewährt und niemals Token (die zeitlich unbegrenzt sind) aktualisiert. Um dieses Problem zu beheben, empfehle ich Ihnen, Ihre Webseiten nach Möglichkeit auf einem HTTPS-fähigen Server zu hosten.