Wir haben eine Website, auf der Sie sich nur mit Facebook anmelden und authentifizieren können (dies war nicht meine Wahl). Wenn Sie sich zum ersten Mal bei Facebook anmelden, wird automatisch ein Konto für Sie erstellt.
Wir möchten jetzt eine iPhone-Anwendung für unsere Website und eine öffentliche API erstellen, damit andere unseren Service nutzen können.
Diese Frage bezieht sich auf die Authentifizierung mit unserer Website über die App / API und ist in zwei Teile unterteilt:
Wie kann die REST-Authentifizierung von einer API zu einer Website, die nur Facebook OAuth als Authentifizierungsmethode verwendet, korrekt verarbeitet werden?
Ich habe viel über Standardauthentifizierungsmethoden für die REST-API gelesen und recherchiert. Methoden wie Basic Auth over HTTPS können nicht verwendet werden , da für einen Benutzer als solchen keine Anmeldeinformationen vorhanden sind. So etwas wie dies scheint für die Authentifizierung von Anwendungen mit der API nur zu sein.
Derzeit ist der beste Weg, den ich mir vorstellen kann, dass Sie einen / authorize-Endpunkt in unserer API erreichen, dieser zu Facebook OAuth umleitet, dann zurück zur Site leitet und ein "Token" bereitstellt, mit dem sich der Benutzer der API anschließend authentifizieren kann Anfragen.
Für eine offizielle Anwendung, die wir erstellen, müssten wir die öffentliche API nicht unbedingt auf die gleiche Weise verwenden. Was wäre dann der beste Weg, um mit unserer Website zu sprechen und Benutzer zu authentifizieren?
Ich verstehe (glaube ich), wie Anwendungen von Drittanbietern, die unsere API verwenden, mithilfe von API-Schlüsseln (öffentlich) und geheimen Schlüsseln (privat) authentifiziert werden. Wenn es jedoch um die Authentifizierung des Benutzers geht, der die App verwendet, bin ich ziemlich verwirrt darüber, wie ich vorgehen soll, wenn wir einen Benutzer nur auf Facebook authentifizieren müssen.
Ich habe das Gefühl, dass mir etwas sehr Offensichtliches fehlt oder ich nicht vollständig verstehe, wie öffentliche REST-APIs funktionieren sollten. Daher wäre jeder Rat und jede Hilfe sehr dankbar.
Antworten:
UPDATE: siehe unten
Ich habe auch über diese Frage nachgedacht. Es ist mir noch nicht ganz klar, aber hier ist der Weg, den ich einschlagen möchte. Ich erstelle eine REST-API und meine Benutzer authentifizieren sich nur mit Facebook Connect.
Auf dem KUNDEN:
Auf der API (für jede Methode, die eine Benutzerauthentifizierung erfordert):
Ich muss das noch testen. Wie hört es sich an?
--- Update: 27. Juli 2014 zur Beantwortung der Frage ---
Ich benutze den oben genannten Austausch nur einmal beim Anmelden. Sobald ich festgestellt habe, welcher Benutzer sich anmeldet, erstelle ich mein eigenes Zugriffstoken, und dieses Token wird ab diesem Zeitpunkt verwendet. Der neue Flow sieht also so aus ...
Auf dem KUNDEN:
Auf der API
quelle
Dies ist meine Implementierung mit JWTs (JSON Web Tokens), die im Grunde der aktualisierten Antwort von Chris ähnelt. Ich habe Facebook JS SDK und JWT verwendet.
Hier ist meine Implementierung.
Client: Verwenden Sie das Facebook JS SDK, um sich anzumelden und das Zugriffstoken zu erhalten.
Client: Fordern Sie JWT von meiner API an, indem Sie den
/verify-access-token
Endpunkt aufrufen .MyAPI: Empfängt das Zugriffstoken und überprüft es, indem Sie den
/me
Endpunkt der Facebook-API aufrufen .MyAPI: Wenn das Zugriffstoken gültig ist, findet der Benutzer aus der Datenbank und meldet den Benutzer an, falls vorhanden. Erstellen Sie eine JWT mit den erforderlichen Feldern als Nutzdaten, legen Sie einen Ablauf fest, signieren Sie mit dem geheimen Schlüssel und senden Sie ihn an den Client zurück.
Client: Speichert das JWT im lokalen Speicher.
Client: Sendet das Token (das JWT aus Schritt 5) zusammen mit der Anforderung für den nächsten API-Aufruf.
MyAPI: Überprüfen Sie das Token mit dem geheimen Schlüssel. Wenn das Token gültig ist, tauschen Sie das Token gegen ein neues aus und senden Sie es zusammen mit der API-Antwort an den Client zurück. (Keine externe API fordert hier nachher eine Überprüfung des Tokens an.) [Wenn das Token ungültig ist / abgelaufen ist, fordern Sie den Client an, sich erneut zu authentifizieren und von 1 zu wiederholen.]
Client Ersetzt das gespeicherte Token durch das neue und verwendet es für den nächsten API-Aufruf. Sobald der Token-Ablauf erreicht ist, läuft der Token ab und widerruft den Zugriff auf die API.
Jeder Token wird einmal verwendet.
Lesen Sie weitere Antworten zu Sicherheit und JWT
Wie sicher ist JWT?
Wenn Sie JWT dekodieren können, wie sind sie sicher?
JSON Web Tokens (JWT) als Benutzeridentifikations- und Authentifizierungstoken
quelle
/debug_token
, damit Sie überprüfen können, ob das Token tatsächlich für Ihre Anwendung ist.access_token
im Client anfordern . Verwenden Sie "Code Workflow". Passcode
zu MyApi und machen eine weitere Runde Reise Book zum Austauschcode
mitaccess_token
. Dies wird hier ausführlicher erklärt: developer.facebook.com/docs/facebook-login/securityIch versuche die gleiche Frage zu beantworten und habe in letzter Zeit viel gelesen ...
Ich werde "die" Antwort nicht haben, aber die Dinge werden für mich etwas klarer. Haben Sie die Kommentare in dem Artikel gelesen, den Sie erwähnt haben ? Ich fand sie sehr interessant und hilfreich.
Infolgedessen und angesichts der Entwicklung der Dinge seit dem Schreiben des ersten Artikels denke ich, dass ich Folgendes tun werde:
HTTPS überall - so können Sie HMAC, Signieren, Nonce, ... vergessen.
Verwenden Sie OAuth2:
Wenn Authentifizierungsanforderungen von meinen eigenen Apps / Websites stammen, verwenden Sie diesen Trick (oder eine Variation davon), der in einer Antwort auf den zuvor genannten Artikel beschrieben ist .
In meinem Fall habe ich zwei Arten von Benutzern: diejenigen mit klassischen Anmelde- / Kennwortanmeldeinformationen und diejenigen, die sich bei Facebook Connect angemeldet haben.
Daher würde ich ein reguläres Anmeldeformular mit der Schaltfläche "Mit Facebook anmelden" bereitstellen. Wenn sich der Benutzer mit seinen "klassischen" Anmeldeinformationen anmeldet, sende ich diese einfach mit einem an meinen OAuth2-Endpunkt
grant_type=password
.Wenn er sich über Facebook anmeldet, ist das meiner Meinung nach ein zweistufiger Prozess:
Bitte beachten Sie, dass ich immer noch intensiv an all diesen Dingen recherchiere, so dass dies möglicherweise keine perfekte Antwort ist ... vielleicht nicht einmal eine richtige! Aber ich denke, das wäre ein guter Ausgangspunkt. Die Idee, einen "Verlängerungszuschuss" für die Facebook-Authentifizierung zu verwenden, könnte darin bestehen, ihn registrieren zu müssen, um die Dinge richtig zu machen? Ich bin mir nicht ganz sicher.
Wie auch immer, ich hoffe, ich konnte Ihnen sogar ein bisschen helfen und zumindest kann es eine Diskussion beginnen, um die beste Lösung für dieses Problem zu finden :)
Update
Das Facebook-Login ist keine Lösung, wie in den Kommentaren angegeben: Jeder kann eine beliebige Benutzer-ID senden und sich als dieser Benutzer in der API anmelden.
Was ist damit:
Sieht besser aus?
quelle