Ich entwickle eine Website, auf die hauptsächlich über eine App zugegriffen wird, und ich möchte OAuth2 für die Benutzerregistrierung und -authentifizierung verwenden. Da es sich um eine Android-App handelt, werde ich mit dem OAuth2-Zeug von Google beginnen, da es auf Android eine anständige Benutzeroberfläche bietet.
Google erklärt, dass "Sie können das Authentifizierungssystem von Google nutzen, um die Nutzerauthentifizierung für Ihre Anwendung auszulagern. Dadurch entfällt die Notwendigkeit, einen Benutzernamen- und Passwortspeicher zu erstellen, zu pflegen und zu sichern." Das ist es, was ich tun möchte. Allerdings Wenn ich alle Beispiele und so weiter durchsehe, kann ich nur etwas über eine Website finden. または eine Anwendung einen Nutzer gegenüber den Google-Diensten authentifizieren.
Und tatsächlich, wenn ich meine App ("Client") bei Googles OAuth2 registrieren möchte, gibt es Optionen für Website-Clients und "installierte" Clients (d. h. eine mobile App), aber nicht für beide. Ich kann zwei getrennte Clients erstellen, aber ich habe den OAuth2-Entwurf gelesen und ich denke, dass es ein Problem geben wird, das ich jetzt erklären werde.
So habe ich mir das vorgestellt:
- Der Benutzer fordert MyApp auf, auf seine privaten Daten zuzugreifen.
- Die App verwendet die Android
AccountManager
Klasse, um ein Zugriffs-Token für die APIs von Google anzufordern. - Android sagt dem Benutzer: "Die App 'MyApp' möchte auf Ihre Basisinformationen bei Google zugreifen. Ist das in Ordnung?"
- Der Benutzer sagt ja.
AccountManager
stellt mit den auf dem Telefon gespeicherten Anmeldedaten eine Verbindung zum OAuth2-Server von Google her und fordert ein Zugriffstoken an.- Das Zugriffstoken (das den grünen Linien folgt) wird zurückgegeben.
AccountManager
gibt das Zugriffs-Token an MyApp zurück.- MyApp sendet eine Anfrage an MySite für die privaten Daten des Benutzers, einschließlich des Zugangstokens.
- MySite muss den Benutzer anhand des Zugriffstokens verifizieren. Es validiert das Token wie hier beschrieben mit Google - "Google, ist dieses Token gültig?".
- Nun, was ich wollen Ich denke, dass Google sagen wird: "Ja, derjenige, der es Ihnen gegeben hat, ist tatsächlich dieser Nutzer.", aber ich denke, dass es (auf der Grundlage des OAuth2-Entwurfs und der Google-Dokumentation) tatsächlich sagen wird: "Auf keinen Fall! Dieses Token ist nur für MyApp gültig, und Sie sind MySite. GTFO!".
Wie sollte ich also vorgehen? Und BITTE sagen Sie nicht "Verwenden Sie OpenID" oder "Verwenden Sie kein OAuth2" oder andere ähnlich wenig hilfreiche Antworten. Oh, und ich würde wirklich gerne weiterhin die nette AccountManager
UI statt beschissenem Popup WebView
s
Editar
Die vorläufige Antwort von Nikolay (ich werde berichten, wenn es funktioniert!) lautet, dass es tatsächlich funktionieren sollte und dass es den Google-Servern egal sein wird, woher das Zugriffstoken stammt. Scheint mir ein bisschen unsicher, aber ich werde sehen, ob es funktioniert!
Update
Ich habe dieses Muster mit Facebook anstelle von Google umgesetzt, und es funktioniert hervorragend. Dem OAuth2-Server ist es egal, woher das Zugriffstoken stammt. Zumindest der von Facebook nicht, also nehme ich an, der von Google auch nicht.
In Anbetracht dessen ist es eine sehr, sehr schlechte Idee, Zugangstoken zu speichern! Aber wir wollen auch nicht auf die Server von Facebook/Google zugreifen müssen, um die Authentifizierung für cada Antrag, da er alles verlangsamen würde. Wahrscheinlich ist es am besten, ein zusätzliches Authentifizierungs-Cookie für Ihre Website hinzuzufügen, das Sie aushändigen, wenn das Zugriffs-Token validiert ist, aber eine einfachere Möglichkeit ist, das Zugriffs-Token wie ein Passwort zu behandeln und einen Hash davon zu speichern. Sie brauchen es auch nicht zu salzen, da Zugangstoken wirklich sehr lang sind. Die obigen Schritte werden also zu etwas wie:
9. MySite muss den Benutzer anhand des Zugangstokens verifizieren. Zunächst wird der Cache mit den gehashten gültigen Zugangstoken überprüft. Wenn der Hash des Tokens dort gefunden wird, weiß sie, dass der Benutzer authentifiziert ist. Andernfalls prüft es mit Google wie hier beschrieben mit Google - "Google, ist dieses Token gültig?".
10. Wenn Google sagt, dass das Zugriffstoken ungültig ist, sagen wir dem Nutzer, dass er verschwinden soll. Andernfalls sagt Google "Ja, das ist ein gültiger Nutzer" und wir überprüfen unsere Datenbank für registrierte Nutzer. Wenn der Google-Nutzername (oder die Facebook-ID, wenn Sie Facebook verwenden) nicht gefunden wird, können wir einen neuen Nutzer erstellen. Anschließend wird der Hashwert des Zugriffstokens zwischengespeichert.