Ich versuche, die delegierte Autorisierung in einer Web-API für mobile Apps mithilfe von OAuth 2.0 zu implementieren. Gemäß der Spezifikation unterstützt der implizite Grant-Flow keine Aktualisierungstoken. Sobald ein Zugriffstoken für einen bestimmten Zeitraum gewährt wurde, muss der Benutzer der App erneut Berechtigungen erteilen, sobald das Token abläuft oder widerrufen wird.
Ich denke, dies ist ein gutes Szenario für Javascript-Code, der in einem Browser ausgeführt wird, wie in der Spezifikation erwähnt. Ich versuche, die Zeiten zu minimieren, in denen der Benutzer der App Berechtigungen erteilen muss, um ein Token zu erhalten. Daher scheint der Ablauf des Autorisierungscodes eine gute Option zu sein, da er Aktualisierungstoken unterstützt.
Dieser Ablauf scheint jedoch stark von einem Webbrowser abhängig zu sein, um die Umleitungen durchzuführen. Ich frage mich, ob dieser Ablauf immer noch eine gute Option für eine mobile App ist, wenn ein eingebetteter Webbrowser verwendet wird. Oder sollte ich mit dem impliziten Fluss gehen?
Antworten:
Erläuterung: Mobile App = Native App
Wie in anderen Kommentaren und einigen Online-Quellen angegeben, scheint implizit eine natürliche Passform für mobile Apps zu sein. Die beste Lösung ist jedoch nicht immer eindeutig (und implizit wird aus den unten diskutierten Gründen nicht empfohlen).
Best Practices für native App OAuth2
Unabhängig davon, für welchen Ansatz Sie sich entscheiden (es sind einige Kompromisse zu berücksichtigen), sollten Sie die hier beschriebenen Best Practices für native Apps mit OAuth2 beachten: https://tools.ietf.org/html/rfc8252
Betrachten Sie die folgenden Optionen
Implizit
Soll ich implizit verwenden?
Zitat aus Abschnitt 8.2 https://tools.ietf.org/html/rfc8252#section-8.2
Autorisierungscode
Wenn Sie sich für den Autorisierungscode entscheiden, besteht ein Ansatz darin, über Ihre eigene Webserverkomponente einen Proxy zu erstellen, der die Tokenanforderungen mit dem Clientgeheimnis angereichert, um zu vermeiden, dass sie in der verteilten App auf Geräten gespeichert werden.
Auszug unten aus: https://dev.fitbit.com/docs/oauth2/
Fazit
Die endgültige Entscheidung sollte Ihre gewünschte Benutzererfahrung, aber auch Ihre Risikobereitschaft berücksichtigen, nachdem Sie eine ordnungsgemäße Risikobewertung Ihrer ausgewählten Ansätze vorgenommen und die Auswirkungen besser verstanden haben.
Eine gute Lektüre finden Sie hier https://auth0.com/blog/oauth-2-best-practices-for-native-apps/
Eine andere ist https://www.oauth.com/oauth2-servers/oauth-native-apps/, die besagt
PKCE-Überlegung
Sie sollten auch PKCE in Betracht ziehen, das hier beschrieben wird: https://www.oauth.com/oauth2-servers/pkce/
Wenn Sie auch den Autorisierungsserver implementieren, gibt https://www.oauth.com/oauth2-servers/oauth-native-apps/checklist-server-support-native-apps/ an , dass Sie dies tun sollten
Überlegungen zu Webansichten
Es gibt viele Beispiele in freier Wildbahn, die Web Views verwenden, z. B. einen eingebetteten Benutzeragenten. Dieser Ansatz sollte jedoch vermieden werden (insbesondere, wenn die App nicht von Erstanbietern stammt). In einigen Fällen kann die Verwendung einer API als Auszug für Sie verboten werden unten von hier demonstriert
Zur weiteren Verdeutlichung finden Sie hier ein Zitat aus diesem Abschnitt eines früheren Entwurfs des oben angegebenen Best-Practice-Links
Einige interessante Punkte werden auch hier angesprochen: /security/179756/why-are-developers-using-embedded-user-agents-for-3rd-party-auth-what-are-the- ein
quelle
Leider glaube ich nicht, dass es eine klare Antwort auf diese Frage gibt. Hier sind jedoch die Optionen, die ich identifiziert habe:
Wenn es in Ordnung ist, den Benutzer nach seinen Anmeldeinformationen zu fragen, verwenden Sie die Anmeldeinformationen für das Kennwort des Ressourcenbesitzers . Dies ist jedoch aus bestimmten Gründen möglicherweise nicht möglich, nämlich
Wenn die Verwendung eines browserbasierten Ablaufs erforderlich ist, verwenden Sie den Autorisierungscode- Ablauf . Hier ist die Definition von
redirect_uri
eine große Herausforderung, für die es folgende Optionen gibt:redirect_uri
(zurn:ietf:wg:oauth:2.0:oob
) dem Autorisierungsendpunkt signalisiert, den Autorisierungscode anzuzeigen, anstatt zur Client-App umzuleiten. Der Benutzer kann diesen Code manuell kopieren oder die App kann versuchen, ihn aus dem HTML-Dokumenttitel abzurufen.localhost
Server am Gerät (die Portverwaltung ist möglicherweise nicht einfach).myapp://...
), das bei einer Dereferenzierung einen registrierten "Handler" auslöst (die Details hängen von der mobilen Plattform ab).Hoffe das hilft
Pedro
quelle
TL; DR: Verwenden Sie Authorization Code Grant mit PKCE
1. Impliziter Grant-Typ
Der implizite Grant-Typ ist bei mobilen Apps sehr beliebt. Aber es sollte nicht so verwendet werden. Es gibt Sicherheitsbedenken in Bezug auf die Weiterleitung. Justin Richer sagt :
Und zusammen mit der Tatsache, dass Sie das Zugriffstoken nicht aktualisieren können, sollten Sie es besser vermeiden.
2. Berechtigungscode Grant-Typ
Die Erteilung des Autorisierungscodes erfordert ein Kundengeheimnis. Sie sollten jedoch keine vertraulichen Informationen im Quellcode Ihrer mobilen App speichern. Leute können sie extrahieren. Um das Client-Geheimnis nicht preiszugeben, müssen Sie einen Server als Vermittler betreiben, wie Facebook schreibt :
Keine ideale Lösung, aber es gibt eine neue, bessere Möglichkeit, OAuth auf Mobilgeräten auszuführen: Proof Key für Code Exchange
3. Berechtigungscode-Gewährungstyp mit PKCE (Proof Key for Code Exchange)
Aus den Einschränkungen heraus wurde eine neue Technik erstellt, mit der Sie den Autorisierungscode ohne Client-Geheimnis verwenden können. Sie können den vollständigen RFC 7636 oder diese kurze Einführung lesen .
von https://oauth.net/2/pkce/
quelle
Die Verwendung einer Webansicht in Ihrer mobilen Anwendung sollte eine kostengünstige Möglichkeit sein, das OAuth2.0-Protokoll auf einer Android-Plattform zu implementieren.
Das Feld redirect_uri ist meiner Meinung
http://localhost
nach eine gute Wahl, und Sie müssen keinen HTTP-Server in Ihre Anwendung portieren, da Sie die Implementierung deronPageStarted
Funktion in derWebViewClient
Klasse überschreiben und das Laden der Webseite beenden können,http://localhost
nachdem Sie denurl
Parameter überprüft haben .quelle
Die reibungsloseste und am einfachsten zu implementierende Benutzererfahrung für die Authentifizierung besteht darin, eine Webansicht in Ihre App einzubetten. Verarbeiten Sie die Antworten, die von der Webansicht vom Authentifizierungspunkt empfangen wurden, und erkennen Sie Fehler (Benutzerabbruch) oder Genehmigung (und extrahieren Sie Token aus URL-Abfrageparametern). Und ich denke, das können Sie tatsächlich auf allen Plattformen. Ich habe diese Arbeit erfolgreich für die folgenden gemacht: iOS, Android, Mac, Windows Store 8.1 Apps, Windows Phone 8.1 App. Ich habe dies für die folgenden Dienste getan: Dropbox, Google Drive, Onedrive, Box, Basecamp. Für die Nicht-Windows-Plattformen habe ich Xamarin verwendet, das angeblich nicht die gesamten plattformspezifischen APIs verfügbar macht, aber genug verfügbar gemacht hat, um dies zu ermöglichen. Es ist also eine ziemlich zugängliche Lösung, selbst aus plattformübergreifender Sicht, und Sie tun es nicht.
quelle