Wir haben eine Website, auf der ich mich nur bei Facebook anmelden und authentifizieren kann (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 besteht aus zwei Teilen:
Wie gehe ich mit der REST Authentifizierung von einer API zu einer Website um, die nur Facebook OAuth als Authentifizierungsmethode verwendet?
Ich habe viel über Standardauthentifizierungsmethoden für REST API gelesen und recherchiert. Methoden wie Basic Auth over HTTPS können nicht verwendet werden, da keine Anmeldeinformationen vorhanden sind für einen Benutzer als solchen. Etwas wie this scheint nur für die Authentifizierung von Anwendungen mithilfe der API zu sein.
Ich denke, Sie treffen derzeit am besten einen/authorize-Endpunkt auf unserer API, leiten ihn zu Facebook OAuth weiter, leiten ihn dann zurück zur Site und stellen einen "Token" bereit, mit dem sich der Benutzer der API anschließend authentifizieren kann Anfragen.
Für eine offizielle Anwendung, die wir erstellen, müssen 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 Drittanbieteranwendungen, die unsere API verwenden, mithilfe von API-Schlüsseln (öffentliche Schlüssel) und geheimen Schlüsseln (private Schlüssel) authentifiziert werden. Wenn es jedoch darum geht, den Benutzer zu authentifizieren, der die App verwendet, bin ich ziemlich verwirrt darüber, wie wir vorgehen sollen, wenn die einzige Möglichkeit, einen Benutzer zu authentifizieren, Facebook ist.
Ich habe das Gefühl, dass mir etwas sehr Offensichtliches fehlt, oder ich verstehe nicht ganz, wie öffentliche REST APIs funktionieren sollten, daher wäre jeder Rat und jede Hilfe sehr willkommen.
Ich habe auch über diese Frage nachgedacht. Es ist mir noch nicht ganz klar, aber hier ist der Weg, den ich mir überlege. Ich erstelle eine REST API für meine Benutzer nur mit Facebook verbinden.
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?
Ich benutze den oben genannten Austausch nur einmal beim Login. Sobald ich festgestellt habe, welcher Benutzer sich anmeldet, erstelle ich mein eigenes Zugriffstoken, und dieses Token wird ab diesem Zeitpunkt verwendet. So sieht der neue Ablauf aus ...
Auf dem KUNDEN:
Auf der API
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 abzurufen.
Client: Fordern Sie JWT von meiner API an, indem Sie den Endpunkt /verify-access-token
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 sich beim Benutzer an, falls vorhanden. Erstellen Sie eine JWT mit 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 dem an den Client zurück API-Antwort. (Keine externe API fordert hier nach die Überprüfung des Tokens an.) [Wenn das Token ungültig ist/der Client für die erneute Authentifizierung abgelaufen ist und von 1 an wiederholt]
Client Ersetzt das gespeicherte Token durch das neue und verwendet es für den nächsten API-Aufruf. Sobald das Ablaufdatum des Tokens erreicht ist, läuft das Token ab, um den Zugriff auf die API zu widerrufen.
Jeder Token wird einmal verwendet.
Lesen Sie weitere Antworten zu Sicherheit und JWT
Wenn Sie JWT dekodieren können, wie sind sie sicher?
JSON-Web-Token (JWT) als Benutzeridentifizierungs- und Authentifizierungstoken
Ich versuche die gleiche Frage zu beantworten und habe in letzter Zeit viel gelesen ...
Ich werde nicht "die" Antwort haben, aber die Dinge werden für mich ein wenig klarer. Haben Sie die Kommentare in dem Artikel, den Sie erwähnt haben gelesen? Ich fand sie wirklich interessant und hilfreich.
Infolgedessen und im Lichte der Entwicklung seit dem ersten Artikel, denke ich, werde ich Folgendes tun:
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 einem zuvor erwähnten Antwort auf den Artikel beschrieben ist.
In meinem Fall habe ich zwei Arten von Benutzern: die mit klassischen Anmelde-/Kennwortdaten und die, die sich bei Facebook Connect angemeldet haben.
Also würde ich ein reguläres Login-Formular mit einem "Login mit Facebook" -Button bereitstellen. Wenn sich der Benutzer mit seinen "klassischen" Anmeldeinformationen anmeldet, sende ich diese einfach mit einem grant_type=password
An meinen OAuth2-Endpunkt.
Wenn er sich über Facebook anmeldet, wäre das meiner Meinung nach ein zweistufiger Prozess:
Bitte beachten Sie, dass ich mich immer noch intensiv mit all diesen Dingen beschäftige, sodass dies möglicherweise keine perfekte Antwort ist ... vielleicht sogar keine richtige! Aber ich denke, das wäre ein guter Ausgangspunkt. Die Idee, ein "Verlängerungsstipendium" für die Facebook-Authentifizierung zu verwenden, könnte darin bestehen, es registrieren zu müssen, um die Dinge richtig zu machen? Ich bin mir nicht ganz sicher.
Wie auch immer, ich hoffe, ich konnte dir sogar ein bisschen helfen, und das kann zumindest eine Diskussion anregen, um die beste Lösung für dieses Problem zu finden :)
Update
Das Facebook-Login ist keine Lösung, wie in den Kommentaren erwähnt: Jeder kann eine beliebige Benutzer-ID senden und sich als dieser Benutzer an der API anmelden.
Was ist damit, es so zu machen:
Sieht besser aus?