Der "richtige" Weg, oAuth von einem mobilen Client aus zu machen

8

Ich erstelle eine plattformübergreifende mobile Anwendung (mit den Xamarian Tools, MonoTouch / MonoDroid). Ich versuche, den Authentifizierungs-Workflow durchzuarbeiten und stolperte in einen Stolperstein. Ich habe überall nach einer klaren Antwort gesucht und muss sie noch finden.

Hier ist eine Übersicht meiner aktuellen Einstellungen.

Ich habe eine Website in nodejs gebaut. Ich benutze pass.js um oAuth Login auf der Website zu tun. Das funktioniert super, Benutzer können sich mit Twitter oder Facebook auf meiner Seite einloggen.

Jetzt möchte ich die gleiche Anmeldefunktionalität auf meine mobilen Clients erweitern.

Ich sehe 2 Optionen

  1. Betten Sie die App-ID und App-Secrets in die mobilen Clients ein und führen Sie direkte oAuth-Aufrufe von der mobilen App an FB oder Twitter durch

  2. Proxy, den der oAuth über meinen bestehenden nodejs Webserver aufruft (die geheimen Schlüssel auf dem Server verwaltend)

Option 2 scheint der bevorzugte Weg zu sein (da es das Verschicken des Geheimnisses in den mobilen Apps vermeidet).

Ich habe den Proxy-Ansatz meistens funktioniert.

  1. Ich öffne ein WebView in meinem mobilen Client und zeige auf http://mysever/auth/twitter
  2. Dies durchläuft meinen bestehenden Code von pass.js und leitet das mobile WebView auf die Twitter-Anmeldeseite um.
  3. Der Benutzer gibt dann seine Werte auf der Twitter-Webseite auf dem Gerät ein.
  4. Twitter ruft dann meine oAuth-Callback-URL an (was mein Nodejs-Webserver ist).
  5. Mein Server und Twitter wickeln die Rückseite einen vierten Händedruck ab, um die Benutzerprofilinformationen zu erhalten () Wie ich es verstehe, ist dies der Schlüssel zu diesem Ansatz, mein Server und Twitter handhaben den Handshake, der mobile Client nicht muss während dieses Vorgangs etwas tun oder Token übergeben )

Hier ist mein Problem :

  1. Es ist dieser letzte Schritt, der mich verstopft. Sobald der Handshake auf meinem Server abgeschlossen ist, habe ich die Benutzerinformationen, die ich auf dem Server brauche, und muss sie an die mobile Client-Anwendung zurücksenden

    Ich kann im WebView-Steuerelement keine Möglichkeit finden, das Antwortobjekt zu greifen und einen Cookie oder einen Header-Wert (zum Beispiel) zu holen (dies scheint für Android und iOS zu gelten). Ich denke nicht, dass es plattformspezifisch ist. Ich denke, ich versuche etwas zu tun, das ein WebView-Widget in mobilen Plattformen einfach nicht unterstützt. Es lässt mich denken, dass ich etwas Offensichtliches vermisse.

Das Einzige, was ich herausgefunden habe, ist, dass mein Webserver den mobilen Client-Browser zu einer gefälschten URL umleitet, die die Benutzerinformationen in der Abfrage enthält. So etwas wie myapp: // info? Userid = 1234

Dann kann ich in der mobilen App die URL laden und diese URL holen und die Daten bekommen, die ich brauche. Ich kann dann diese Benutzerinfo speichern, das WebView-Steuerelement schließen und zu einem nativen Bildschirm in meiner mobilen Anwendung wechseln und die Benutzerinfo in nachfolgenden REST-Aufrufen an meinen Nodejs-Server verwenden, um den Benutzer zu identifizieren.

Dies ist aus mehreren Gründen massiv kludgy. Die größte davon ist, dass die URL unverschlüsselt über das Kabel gesendet wird und alle Daten im Klartext vorliegen.

Es muss einen besseren Weg geben, um die Daten vom Webserver zum mobilen Client zurück zu bekommen.

Oder mache ich alles falsch?

    
Brad Cunningham 14.02.2013, 23:10
quelle

2 Antworten

3

Die einfachste Art, OAuth für Xamarin sowohl für iOS als auch für Android zu implementieren, ist Xamarin.Auth . Die Starter-Dokumentation für den Client ist hier . Ich denke, es sollte alles sicher erhalten und Sie müssen sich keine Sorgen darüber machen, Ihren Node-Server als Proxy verwenden zu müssen.

Sie müssen Ihre Anwendungs-ID als Teil der Anrufe angeben, aber ich habe dort nicht zu viele oder irgendwelche Sicherheitsprobleme, um die ich mich kümmern muss.

Ich weiß, dass dies gegen das ist, was Sie bereits implementiert haben, aber vielleicht könnte dies dazu beitragen, die Dinge ein wenig zu vereinfachen.

    
Mike Stonis 14.02.2013 23:55
quelle
0

Dies ist das gleiche Dilemma, mit dem ich es zu tun habe. So gehe ich derzeit damit um. In meiner App kann der Kunde direkt oder über einen anderen Dienst wie Facebook, das ist mein Haupt und daher die, auf die ich mich konzentriert habe, kommen.

Facebook kann entweder über einen POST (Desktop Apps) oder ein GET (Handy) umleiten.

Ich überprüfe die anfängliche Anfrage, um zu sehen, ob sie eine Service-ID hat - hier ist zum Beispiel das Facebook GET.

%Vor%

Der facebook POST unterscheidet sich ein wenig dadurch, dass Sie in base64url einen Access Token encode erhalten. Das GET gibt Ihnen einen Code, den Sie gegen ein Zugangstoken eintauschen können, aber ich hatte Probleme damit und habe mich nur für die Einbindung in das Pass-System entschieden.

Wenn ein Client direkt kommt, suche ich nach der Sitzung oder nach einem verschlüsselten Cookie, das in die lokale Strategie eingebunden ist. Dies überprüft dann die db für ein Zugriffs-Token, mit dem beispielsweise auf die facebook API zugegriffen werden kann.

Wenn ein Kunde nicht erkannt wird, kann er sich über Facebook, Google usw. authentifizieren.

Die Hauptsache ist, dass nur zwei Informationen zusammen mit dem Client gespeichert werden, die Pass-Session-ID und die App-Nutzer-ID

connect.sid - verschlüsselter Cookie

userId - verschlüsselter Cookie

Ich wäre daran interessiert, herauszufinden, wie andere Leute mit dem Thema umgehen.

    
Simon Tomlin 15.02.2013 08:07
quelle