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
Der implizite Berechtigungsfluss für die Gewährung von OAuth 2.0 (definiert in Abschnitt 4.2 von OAuth 2.0 [RFC6749]) funktioniert im Allgemeinen mit der Praxis, die Autorisierungsanforderung im Browser auszuführen und die Autorisierungsantwort über eine URI-basierte Kommunikation zwischen Apps zu empfangen.
Da der implizite Fluss jedoch nicht durch PKCE [RFC7636] geschützt werden kann (was in Abschnitt 8.1 erforderlich ist), wird die Verwendung des impliziten Flusses mit nativen Apps NICHT EMPFOHLEN .
Über den impliziten Datenfluss gewährte Zugriffstoken können auch nicht ohne Benutzerinteraktion aktualisiert werden. Daher ist der Berechtigungscode-Erteilungsfluss, der Aktualisierungstoken ausgeben kann, die praktischere Option für native App-Berechtigungen, bei denen Zugriffstoken aktualisiert werden müssen.
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/
Der Authorization Code Grant-Ablauf wird für Anwendungen empfohlen, die über einen Webdienst verfügen. Dieser Ablauf erfordert eine Server-zu-Server-Kommunikation unter Verwendung des Client-Geheimnisses einer Anwendung.
Hinweis: Legen Sie Ihr Client-Geheimnis niemals in verteilten Code, z. B. Apps, die über einen App Store oder clientseitiges JavaScript heruntergeladen wurden.
Anwendungen, die keinen Webdienst haben, sollten den impliziten Grant-Flow verwenden.
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
Die derzeitige Best Practice der Branche besteht darin, den Autorisierungsablauf zu verwenden, während das Clientgeheimnis weggelassen wird, und einen externen Benutzeragenten zu verwenden, um den Ablauf abzuschließen. Ein externer Benutzeragent ist normalerweise der native Browser des Geräts (mit einer von der nativen App getrennten Sicherheitsdomäne), sodass die App nicht auf den Cookie-Speicher zugreifen oder den Seiteninhalt im Browser überprüfen oder ändern kann.
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
- Ermöglichen Sie Clients, benutzerdefinierte URL-Schemata für ihre Umleitungs-URLs zu registrieren.
- Unterstützt Loopback-IP-Umleitungs-URLs mit beliebigen Portnummern, um Desktop-Apps zu unterstützen.
- Gehen Sie nicht davon aus, dass native Apps ein Geheimnis für sich behalten können. Fordern Sie alle Apps auf, anzugeben, ob sie öffentlich oder vertraulich sind, und geben Sie nur vertrauliche Apps an Kundengeheimnisse weiter.
- Unterstützen Sie die PKCE-Erweiterung und fordern Sie, dass öffentliche Clients sie verwenden.
- Versuchen Sie zu erkennen, wann die Autorisierungsoberfläche in die Webansicht einer nativen App eingebettet ist, anstatt in einem Systembrowser gestartet zu werden, und lehnen Sie diese Anforderungen ab.
Ü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
Jeder Versuch, die OAuth 2.0-Authentifizierungsseite einzubetten, führt dazu, dass Ihre Anwendung von der Fitbit-API gesperrt wird.
Aus Sicherheitsgründen muss die OAuth 2.0-Autorisierungsseite in einer dedizierten Browseransicht angezeigt werden. Fitbit-Benutzer können nur bestätigen, dass sie sich bei der echten Fitbit.com-Website authentifizieren, wenn sie über die vom Browser bereitgestellten Tools verfügen, z. B. die URL-Leiste und TLS-Zertifikatinformationen (Transport Layer Security).
Für native Anwendungen bedeutet dies, dass die Autorisierungsseite im Standardbrowser geöffnet werden muss. Native Anwendungen können benutzerdefinierte URL-Schemata als Umleitungs-URIs verwenden, um den Benutzer vom Browser zurück zur Anwendung umzuleiten, die um Erlaubnis bittet.
iOS-Anwendungen verwenden möglicherweise die SFSafariViewController-Klasse, anstatt die App auf Safari umzustellen. Die Verwendung der WKWebView- oder UIWebView-Klasse ist verboten.
Android-Anwendungen verwenden möglicherweise benutzerdefinierte Chrome-Registerkarten, anstatt die App auf den Standardbrowser umzuschalten. Die Verwendung von WebView ist verboten.
Zur weiteren Verdeutlichung finden Sie hier ein Zitat aus diesem Abschnitt eines früheren Entwurfs des oben angegebenen Best-Practice-Links
Eingebettete Benutzeragenten, die üblicherweise mit Webansichten implementiert werden, sind eine alternative Methode zum Autorisieren nativer Apps. Sie sind jedoch per Definition für die Verwendung durch Dritte unsicher. Der Benutzer meldet sich mit seinen vollständigen Anmeldeinformationen an, um sie dann auf weniger leistungsfähige OAuth-Anmeldeinformationen zu reduzieren.
Selbst wenn sie von vertrauenswürdigen Erstanbieter-Apps verwendet werden, verletzen eingebettete Benutzeragenten das Prinzip der geringsten Berechtigungen, indem sie leistungsfähigere Anmeldeinformationen als erforderlich erhalten, wodurch möglicherweise die Angriffsfläche vergrößert wird.
In typischen Webansicht-basierten Implementierungen eingebetteter Benutzeragenten kann die Hostanwendung: jeden im Formular eingegebenen Tastenanschlag protokollieren, um Benutzernamen und Kennwörter zu erfassen; Formulare automatisch einreichen und Einwilligung des Benutzers umgehen; Kopieren Sie Sitzungscookies und verwenden Sie sie, um authentifizierte Aktionen als Benutzer auszuführen.
Wenn Benutzer dazu ermutigt werden, Anmeldeinformationen in einer eingebetteten Webansicht ohne die übliche Adressleiste und andere Identitätsfunktionen einzugeben, über die Browser verfügen, kann der Benutzer nicht erkennen, ob sie sich bei der legitimen Website anmelden, und selbst wenn dies der Fall ist, werden sie geschult dass es in Ordnung ist, Anmeldeinformationen einzugeben, ohne die Site zuerst zu validieren.
Abgesehen von den Sicherheitsbedenken teilen Webansichten den Authentifizierungsstatus nicht mit anderen Apps oder dem Systembrowser, sodass sich der Benutzer für jede Autorisierungsanforderung anmelden muss, was zu einer schlechten Benutzererfahrung führt.
Aus den oben genannten Gründen wird die Verwendung eingebetteter Benutzeragenten NICHT EMPFOHLEN, es sei denn, eine vertrauenswürdige Erstanbieter-App fungiert als externer Benutzeragent für andere Apps oder bietet eine einmalige Anmeldung für mehrere Erstanbieter-Apps.
Autorisierungsserver sollten in Betracht ziehen, Schritte zu unternehmen, um Anmeldungen über eingebettete Benutzeragenten zu erkennen und zu blockieren, die nach Möglichkeit nicht ihre eigenen sind.
Einige interessante Punkte werden auch hier angesprochen: /security/179756/why-are-developers-using-embedded-user-agents-for-3rd-party-auth-what-are-the- ein