web-dev-qa-db-de.com

Design für die Facebook-Authentifizierung in einer iOS-App, die auch auf einen gesicherten Webdienst zugreift

Ziel: Ermöglicht einem Benutzer die Authentifizierung bei Facebook in einer iOS-Anwendung, die den Zugriff auf einen geschützten Webdienst erfordert, den ich ausführe.

Annahmen: Es gibt ein systemeigenes Authentifizierungs nd Registrierungs-) System für Benutzer, die sich dafür entscheiden, Facebook nicht zum Anmelden zu verwenden.

Details:

Ich bin überrascht, dass Facebook in der Entwicklerdokumentation keine Best Practices dafür enthält. Die gesamte vorhandene Dokumentation setzt voraus, dass Sie die FB-Authentifizierung in eine Website oder eine eigenständige mobile App ohne zu authentifizierenden Dienst integrieren.

Hier sind meine ersten Gedanken darüber, wie dies gestaltet werden soll, aber ich möchte überprüfen, ob es korrekt ist.

  1. Der Client öffnet das Facebook iOS Login
  2. Benutzeroberfläche Der Benutzer meldet sich mit Facebook-Anmeldeinformationen an und erhält ein Zugriffstoken
  3. iOS App übergibt Zugriffstoken an unseren Server
  4. Unser Server kommuniziert mit der FB-Graph-API unter Verwendung des Zugriffstokens, um (a) das Token zu validieren und (b) die FB-Benutzer-ID für dieses Zugriffstoken abzurufen.

    z.B. Unser Server würde --- (https://graph.facebook.com/me/?access_token=XYZ aufrufen und Profilinformationen in einem JSON-Objekt zurückgeben

  5. Vorausgesetzt, es ist gültig, extrahiert unser Server die Benutzer-ID aus dem JSON-Objekt und prüft, ob der Benutzer bereits über ein Konto verfügt. In diesem Fall stellen wir dem Kunden ein eigenes Authentifizierungsticket für diese Sitzung aus. Wenn der Benutzer kein Konto hat, erstellen wir ein neues mit der Facebook-Benutzer-ID, vergeben unsere eigene eindeutige Benutzer-ID und stellen unser Authentifizierungsticket aus.

  6. Der Client gibt dann das Authentifizierungsticket für nachfolgende Interaktionen zurück, die eine Authentifizierung erfordern.

Dies scheint mir die richtige Herangehensweise zu sein, aber ich bin mir nicht sicher, ob mir etwas wahnsinnig Grundlegendes fehlt und ich den falschen (komplizierten) Weg gehe.

393
TMC

Ich habe mich nur selbst darum gekümmert, und hier ist der Teil, der mich gebissen hat:

In Schritt 5 ... Es ist einem Benutzer möglich, sich für ein Konto bei Ihnen zu registrieren, das von seiner Facebook-ID völlig getrennt ist, oder? Dann melden sie sich ein anderes Mal bei Facebook an .... Und Sie haben gerade einen zweiten Account erstellt und ihren ersten verloren.

Es muss eine Möglichkeit geben, sich bei Ihrem Webdienst anzumelden, sich dann bei Facebook anzumelden und die Zuordnung zwischen der Facebook-ID und dem lokalen Konto zu erfassen.

Abgesehen davon klingt Ihr Plan solide.

Update : Facebook hat ein Dokument hinzugefügt, das ein solches Szenario beschreibt HIER

76
Dan Ray

Verwenden Sie https, um das Authentifizierungstoken wie von Facebook angegeben an Ihren Server zu übertragen

Teilen von Zugriffstoken

Unsere Datenrichtlinien untersagen ausdrücklich das Teilen eines Zugriffstokens für Ihre App mit einer anderen App. Wir erlauben Entwicklern jedoch, Tokens zwischen einer nativen Implementierung und einer Serverimplementierung derselben App (dh unter Verwendung derselben App-ID) zu teilen, solange die Übertragung unter Verwendung von HTTPS erfolgt.

28
zoomcrypt

Ein Problem, das ich bei dieser Strategie sehen kann, ist, dass jemand Ihnen ein Zugriffstoken geben kann, das Sie für eine andere Facebook-App erhalten haben. Soweit ich weiß, gibt es keine Möglichkeit, zu überprüfen, ob das Zugriffstoken für Ihre Anwendung geeignet ist. Sie können es also einfach weiter verwenden.

Es klingt jedoch nicht sehr schädlich. Im Allgemeinen versuchen Personen/Apps, die Zugriffstoken zu schützen, anstatt sie gemeinsam zu nutzen.

Ein möglicher Vorteil davon ist, dass jemand seine eigene Site oder mobile App erstellt, Zugriffstoken für seine Benutzer erhält und versucht, sie mithilfe Ihrer API zu authentifizieren. Wenn dies erfolgreich ist (der Benutzer verfügt über ein Facebook-Konto auf Ihrer Website), kann die bösartige Website Ihre API als Benutzer verwenden.

Es ist ein bisschen langwierig, aber ich denke, es könnte funktionieren.

Bearbeiten: Es sieht so aus, als ob es eine Möglichkeit gibt, das Zugriffstoken zu validieren. Lesen Sie die Antwort von @Daaniel auf Frage Abrufen der Anwendungs-ID vom Benutzerzugriffstoken (oder Überprüfen der Quellanwendung für ein Token) .

14
ivant

ihre Lösung funktioniert völlig.

Vielleicht eine Alternative: Warum nicht einfach die E-Mail von der ersten Anfrage nach einem sozialen Dienst auf dem Client abrufen und an Ihren Webdienst senden? Der Webservice könnte einfach die E-Mail speichern, und möglicherweise auch einen Social Provider. Ihr Webdienst kann zwar nicht überprüfen, woher die E-Mail stammt, es besteht jedoch ein Vertrauensverhältnis zwischen Ihrem Webdienst und Ihrem Kunden. Wenn ja, können Sie sich anscheinend darauf verlassen, dass die E-Mail vom richtigen Ort kommt. Jemand, bitte lassen Sie mich wissen, was für eine offensichtliche Sache ich vermisse, die den E-Mail-basierten Ansatz albern macht ...

4
hamsterdam