6

Ich arbeite an einer Erweiterung, die mit Facebook verbunden werden muss, um einige Benutzerdaten herunterzuladen. Ich bin den Details des OAuth-Tanzes etwas unbekannt und konnte dies nicht mit der gewünschten Sicherheit umsetzen. Im aktuellen Setup (das funktioniert) mache ich mir Sorgen um Übeltäter, die den Namen meiner Anwendung kapern und damit Spam verschicken.Der korrekte Weg zu OAuth von einem Desktop-Client ohne einen Server

Ich habe viele verschiedene Techniken versucht, um OAuth (Login mit Facebook im Besonderen) in meiner Erweiterung zu implementieren. Das aktuelle Setup verwendet Facebook's Manual Login flow.

  1. Öffnen Sie das OAuth-Popupfenster in der Sandbox-Registerkarte.
  2. Setzen Sie redirect_url auf "special", internal facebook page, für die keine konfigurierten Weiterleitungs-URLs erforderlich sind. Legen Sie den Parameter auth_token so fest, dass ein auth_token und kein temporärer Code zurückgegeben wird.
  3. Injizieren Sie Javascript in die spezielle Weiterleitungsseite, die eine Nachricht an die Erweiterung mit dem auth_token sendet.

Dies funktioniert wie erwartet. Ich bin in der Lage, Benutzer auth_token zu erhalten, nachdem sie meiner App Erlaubnis per Popup gegeben haben.

Ich bin besorgt über die Sicherheit, da die Erweiterung keinen Server zum Speichern eines geheimen Schlüssels hat, noch eine gültige Domäne hat, um redirect_urls zu begrenzen und die Authentizität von Autorisierungsanfragen zu überprüfen. Aufgrund dieses Flusses: Ein Hacker könnte einfach die Quelle auf meine Erweiterung herunterladen, die Facebook App ID stehlen, Popup-Fenster für meine App von ihren eigenen Websites generieren und auth_tokens erhalten, die im Auftrag "via" meine Anwendung posten können.

Noch viel mehr, die official Google Chrome gudie to OAuth in Extensions empfiehlt die Einbettung Ihrer consumer_secret in die Erweiterung. Dies scheint kontraintuitiv zu sein.

Ich bin recht zuversichtlich, dies auf zwei Arten gelöst werden kann:

  1. meinen eigenen Server erstellen, die zwischen meiner Erweiterung und Facebook als Proxy fungiert. Ich könnte die redirect_url auf meine benutzerdefinierte Domain setzen, consumer_secret auf meinem Server speichern und eine enge API zwischen dem Client und meinem eigenen Server definieren.
  2. Beschränken Sie die Autorisierungsumleitung auf meine Chrome-Erweiterungs-ID (ungefähr so, wie das Facebook iOS SDK App-Store-Paket-IDs verwendet). Leider kann ich meine Facebook-App nicht mit einer Chrome-Erweiterungs-ID verknüpfen. Es heißt "ungültige URL".

Ich würde die zweite Option bevorzugen, da das Ausführen eines Servers teuer sein kann und einen weiteren Fehlerpunkt für die Erweiterung darstellt. Benutzer müssen sich auch mit "Black Box" -Code beschäftigen, der ihre auth_tokens hält, was saugt.

Interessanterweise scheint Facebook eine Ausnahme für ms-app: // URLs (Windows 8-Anwendungen) zu machen. Warum nicht Chrome-Erweiterung: // URLs?

Also meine Frage: - Ist das möglich? Fehle ich etwas? Zweitens: Werde ich wegen dieser Art von Hijacking-Angriff paranoid? Es scheint ziemlich gutartig zu sein, aber ich möchte Hackern nicht erlauben, den OAuth-Dialog meiner App zu übernehmen.

Danke

+0

Ich wette, die * Hacker * wissen nichts davon: http://seclab.web.cs.illinois.edu/wp-content/uploads/2011/03/BoyerHOBGR07.pdf –

Antwort

2

Ihre Intuition ist richtig.Laut Facebook Entwickler-doc:

Never include your App Secret in client-side or decompilable code.

Der Grund dafür ist genau das, was Sie gesagt haben, auch in kompilierter, verschleierten Byte-Code, es ziemlich trivial ist mit modernen Methoden der App Geheimnis Reverse Engineering , auch wenn Sie https verwenden.

Die beste Vorgehensweise in dieser Situation wäre eine gehostete API, die verwendet wird, um alle Anmeldungen über eine externe Quelle zu übertragen und die App-ID und das App-Geheimnis in einer separaten Konfigurationsdatei auszublenden.

+0

Richtig - aber ist ist es sicher, Facebooks manuellen Login-Flow mit der internen redirect_url zu verwenden? Dies erfordert nicht das App-Geheimnis. Gibt es außerdem eine Möglichkeit, eine Chrome-Erweiterung zu verwenden: // url als redirect_url? Wäre das sicher? –

+0

Es gibt keine Möglichkeit, eine Chrome-Erweiterungs-URL als Callback-URL zu verwenden. Wenn Sie darüber nachdenken, macht es einen intuitiven Sinn. Wenn du facebook die URL chrome-extension: //abcdefghijklmnopqrstuvwxyz/index.html gibst, die nur im Kontext deines lokalen Rechners Sinn macht, hätte Facebook keine Möglichkeit, diese Adresse aufzulösen und sie an einen sinnvollen Ort zu senden. Wenn Sie möchten, können Sie einen Server an einem beliebigen offenen Port hochfahren, um auf die Antwort von Facebook zu hören, und http: // yourip: port als Callback-URL verwenden (beachten Sie dies nicht). Aber dann stoßen Sie auf Probleme mit Firewalls, Berechtigungen usw. –

+0

Beachten Sie, dass das immer noch nicht sicher ist. Sobald ein Benutzer Ihrer Anwendung Zugriff auf ihre Daten gewährt hat, liegt es in Ihrer Verantwortung als Entwickler sicherzustellen, dass nur Ihre Anwendung auf diese Daten zugreifen kann. Solange Sie sich auf eine beliebige Form der clientseitigen Authentifizierung verlassen, kann ein böswilliger Benutzer die Anfragen Ihres Clients manipulieren und mit den Anmeldeinformationen Ihrer App auf diese Daten zugreifen. –

Verwandte Themen