OAuth 2.0 verfügt über mehrere Workflows. Ich habe ein paar Fragen zu den beiden.
- Ablauf des Autorisierungscodes - Der Benutzer meldet sich über die Client-App an. Der Autorisierungsserver gibt einen Autorisierungscode an die App zurück. Die App tauscht dann den Autorisierungscode gegen das Zugriffstoken aus.
- Impliziter Grant-Flow - Der Benutzer meldet sich über die Client-App an. Der Autorisierungsserver stellt ein Zugriffstoken direkt an die Client-App aus.
Was ist der Unterschied zwischen den beiden Ansätzen in Bezug auf die Sicherheit? Welches ist sicherer und warum?
Ich sehe keinen Grund, warum ein zusätzlicher Schritt (Austauschautorisierungscode für Token) in einem Workflow hinzugefügt wird, wenn der Server direkt ein Zugriffstoken ausstellen kann.
Verschiedene Websites geben an, dass der Autorisierungscode-Fluss verwendet wird, wenn die Client-App die Anmeldeinformationen sicher aufbewahren kann. Warum?
Antworten:
Dies
access_token
ist, was Sie benötigen, um eine geschützte Ressource (eine API) aufzurufen. Im Ablauf des Autorisierungscodes gibt es zwei Schritte, um ihn abzurufen:code
an den API-Konsumenten zurückgeben (als "Client" bezeichnet).code
in # 1 erhaltene gegen ein ausaccess_token
und authentifiziert sich mit einemclient_id
undclient_secret
access_token
.Es gibt also eine doppelte Überprüfung: Der Benutzer, dem die Ressourcen gehören, die über eine API aufgetaucht sind, und der Client, der die API verwendet (z. B. eine Web-App). Beide sind für die Gewährung des Zugriffs validiert. Beachten Sie die "Autorisierung" von OAuth hier: Der Benutzer gewährt
code
einer App Zugriff auf seine Ressource (über die nach der Authentifizierung zurückgegebene), die App erhält eineaccess_token
und ruft im Namen des Benutzers auf.Im impliziten Ablauf wird Schritt 2 weggelassen. Nach der Benutzerauthentifizierung wird ein
access_token
direkt zurückgegeben, mit dem Sie auf die Ressource zugreifen können. Die API weiß nicht, wer diese API aufruft. Jeder mit deraccess_token
Dose, während im vorherigen Beispiel nur die Web-App (die Interna sind normalerweise für niemanden zugänglich).Der implizite Fluss wird normalerweise in Szenarien verwendet, in denen gespeichert wird
client id
undclient secret
wird nicht empfohlen (ein Gerät zum Beispiel, obwohl viele es tut sowieso). Das bedeutet der Haftungsausschluss. Die Benutzer haben Zugriff auf den Clientcode und können daher die Anmeldeinformationen abrufen und sich als Ressourcenclients ausgeben. Im impliziten Fluss sind alle Daten flüchtig und es ist nichts in der App gespeichert.quelle
/authorize
Bitte. Der Browser und die Website, die versuchen, die API (auch als Client bezeichnet) aufzurufen. Dies ist dasredirect_uri
+,code
das der AS nach erfolgreicher Authentifizierung zurückgibt. Schließlich ruft der Client den AS hinter den Kulissen an und tauscht ihncode
gegen einen ausaccess_token
. Dies ist dietoken endpoint
in der Literatur. Im Allgemeinen ruft der AS niemals jemanden an. Es antwortet immer.Ich werde hier etwas hinzufügen, von dem ich glaube, dass es in den obigen Antworten nicht klar ist:
tl; dr verwendet keinen impliziten Fluss , wenn Sie nicht dem Benutzer Maschine zu halten , Tokens vertrauen , aber Sie tun Ihren eigenen Servern vertrauen.
quelle
access_token
mit Hilfe von zu erhaltenauthorization code
.Der Unterschied zwischen beiden ist:
Im impliziten Ablauf wird das Token direkt über die Umleitungs-URL mit dem Zeichen "#" zurückgegeben. Dies wird hauptsächlich in Javascript-Clients oder mobilen Anwendungen verwendet, die keine eigene Serverseite haben, und der Client muss in einigen Implementierungen sein Geheimnis nicht angeben .
Im Autorisierungscode-Fluss wird Code mit "?" Zurückgegeben. Um von der Serverseite lesbar zu sein, muss die Serverseite diesmal das Client-Geheimnis für die Token-URL bereitstellen, um das Token als JSON-Objekt vom Autorisierungsserver abzurufen. Es wird verwendet, wenn Sie einen Anwendungsserver haben, der dies handhaben und Benutzertoken mit seinem Profil auf seinem eigenen System speichern kann, und wird hauptsächlich für gängige mobile Anwendungen verwendet.
Es hängt also von der Art Ihrer Client-Anwendung ab, welcher weitere sichere "Autorisierungscode", da er das Geheimnis auf dem Client anfordert, und das Token zwischen Autorisierungsserver und Client-Anwendung über eine sehr gesicherte Verbindung gesendet werden können, und der Autorisierungsanbieter kann dies Beschränken Sie einige Clients darauf, nur "Autorisierungscode" zu verwenden, und lassen Sie Implicit nicht zu
quelle
Die implizite Erteilung ähnelt der Erteilung des Autorisierungscodes mit zwei unterschiedlichen Unterschieden.
Es ist für Benutzeragenten-basierte Clients (z. B. einseitige Web-Apps) vorgesehen, die einen Client nicht geheim halten können, da der gesamte Anwendungscode und Speicher leicht zugänglich sind.
Zweitens gibt der Autorisierungsserver anstelle des Autorisierungsservers, der einen Autorisierungscode zurückgibt, der gegen ein Zugriffstoken ausgetauscht wird, ein Zugriffstoken zurück.
Details finden Sie hier http://oauth2.thephpleague.com/authorization-server/which-grant/
quelle
Impliziter Fluss
Vorteile
Nachteile
Ablauf des Autorisierungscodes
Vorteile
Nachteile
Zitat: https://developers.google.com/actions/develop/identity/oauth2-overview#supported_oauth_20_flows
quelle
Lassen Sie mich die Punkte zusammenfassen, die ich aus den obigen Antworten gelernt habe, und einige meiner eigenen Erkenntnisse hinzufügen.
Ablauf des Autorisierungscodes !!!
Impliziter Grant Flow !!!
quelle
Beide sind sicher, dies hängt von der Umgebung ab, in der Sie sie verwenden.
Es ist einfach. Ihr Kunde ist nicht sicher. Lassen Sie es uns im Detail sehen.
Stellen Sie sich vor, Sie entwickeln eine Anwendung gegen
Instagram API
, registrieren Sie Ihre APP beiInstagram
und definierenAPI's
Sie , welche Sie benötigen.Instagram
wird Sie mitclient_id
und versorgenclient_secrect
Auf Ihrer Website haben Sie einen Link eingerichtet, der besagt. "Komm und benutze meine Anwendung". Wenn Sie darauf klicken, sollte Ihre Webanwendung zwei Anrufe tätigen
Instagram API
.First
Senden Sie eine Anfrage anInstagram Authentication Server
mit den folgenden Parametern.Sie senden nicht
client_secret
, Sie konnten dem Client nicht vertrauen (dem Benutzer und / oder seinem Browser, die versuchen, Ihre Anwendung zu verwenden). Der Client kann die URL oder das Java-Skript sehen und Ihreclient_secrect
leicht finden. Deshalb brauchen Sie einen weiteren Schritt.Sie erhalten ein
code
undstate
. Dascode
hier isttemporary
und wird nirgendwo gespeichert.Dann
second
rufen Sie anInstagram API
(von Ihrem Server)Da der Anruf von unserem Server aus getätigt wird, können wir sicher verwenden
client_secret
(was zeigt, wie wir sind), mitcode
welchen Shows der Benutzer dieclient_id
Nutzung der Ressource gewährt hat .Als Antwort werden wir haben
access_token
quelle
Aus praktischer Sicht (was ich verstanden habe) ist der Hauptgrund für den Authz-Code-Fluss:
"Der Autorisierungsserver authentifiziert den Ressourcenbesitzer (über den Benutzeragenten) und stellt fest, ob der Ressourcenbesitzer die Zugriffsanforderung des Clients gewährt oder verweigert."
Darüber hinaus können Apps mithilfe von Aktualisierungstoken langfristig auf Benutzerdaten zugreifen.
quelle
Es scheint zwei wichtige Punkte zu geben, die bisher nicht erörtert wurden und die erklären, warum der Umweg im Berechtigungscode-Gewährungstyp die Sicherheit erhöht.
Kurzgeschichte : Der Berechtigungscode-Gewährungstyp speichert vertrauliche Informationen aus dem Browserverlauf, und die Übertragung des Tokens hängt nur vom HTTPS-Schutz des Autorisierungsservers ab.
Längere Version:
Im Folgenden werde ich mich an die im RFC definierte OAuth 2-Terminologie halten (es ist ein schnelles Lesen): Ressourcenserver , Client , Autorisierungsserver , Ressourceneigentümer .
Stellen Sie sich vor, Sie möchten, dass eine Drittanbieter-App (= Client) auf bestimmte Daten Ihres Google-Kontos (= Ressourcenserver) zugreift. Nehmen wir einfach an, Google verwendet OAuth 2. Sie sind der Ressourcenbesitzer für das Google-Konto, betreiben jedoch derzeit die Drittanbieter-App.
Zunächst öffnet der Client einen Browser, um Sie an die sichere URL des Google-Autorisierungsservers zu senden. Anschließend genehmigen Sie die Zugriffsanforderung, und der Autorisierungsserver sendet Sie mit dem Autorisierungscode in der Abfragezeichenfolge an die zuvor angegebene Weiterleitungs-URL des Clients zurück. Nun zu den beiden wichtigsten Punkten:
Mit dem Berechtigungscode-Gewährungstyp wird das Token schließlich durch einen Aufruf des Clients an den Autorisierungsserver abgerufen, wobei die Übertragungssicherheit nur vom Autorisierungsserver und nicht vom Client abhängt .
quelle