it-swarm.com.de

REST API für eine Website, die Facebook zur Authentifizierung verwendet

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:

  1. 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.

  2. 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.

82
Adam

UPDATE: siehe unten

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:

  1. Verwenden Sie die Facebook-API, um sich anzumelden und einen OAUTH2-Code zu erhalten.
  2. Tauschen Sie diesen Code gegen ein Zugriffstoken aus.
  3. Bei jedem Aufruf meiner benutzerdefinierten API werden die Facebook-Benutzer-ID und das Zugriffstoken angegeben.

Auf der API (für jede Methode, die eine Benutzerauthentifizierung erfordert):

  1. Fordern Sie das/me Facebook-Diagramm mit dem Zugriffstoken von oben an.
  2. Stellen Sie sicher, dass die zurückgegebene Facebook-Benutzer-ID mit der von oben an meine API übergebenen Benutzer-ID übereinstimmt.
  3. Wenn das Zugriffstoken abgelaufen ist, ist zusätzliche Kommunikation erforderlich.

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 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:

  1. Verwenden Sie die Facebook-API, um sich anzumelden und einen OAUTH2-Code zu erhalten.
  2. Tauschen Sie diesen Code gegen ein Zugriffstoken aus.
  3. Fordern Sie ein Zugriffstoken von my API an, einschließlich des Facebook-Tokens als Parameter

Auf der API

  1. Erhalten Sie eine Zugriffsanforderung.
  2. Stellen Sie mit dem Facebook-Zugriffstoken eine Anfrage an das/me-Facebook-Diagramm
  3. Stellen Sie sicher, dass der Facebook-Benutzer vorhanden ist und mit einem Benutzer in meiner Datenbank übereinstimmt
  4. Erstellen Sie mein eigenes Zugriffstoken, speichern Sie es und senden Sie es an den Client zurück, um es von diesem Punkt an zu verwenden
90
Chris Greenwood

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.

  1. Client: Verwenden Sie das Facebook JS SDK, um sich anzumelden und das Zugriffstoken abzurufen.

  2. Client: Fordern Sie JWT von meiner API an, indem Sie den Endpunkt /verify-access-token Aufrufen.

  3. MyAPI: Empfängt das Zugriffstoken und überprüft es, indem Sie den /me - Endpunkt der Facebook-API aufrufen.

  4. 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.

  5. Client: Speichert das JWT im lokalen Speicher.

  6. Client: Sendet das Token (das JWT aus Schritt 5) zusammen mit der Anforderung für den nächsten API-Aufruf.

  7. 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]

  8. 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

Wie sicher ist JWT?

Wenn Sie JWT dekodieren können, wie sind sie sicher?

JSON-Web-Token (JWT) als Benutzeridentifizierungs- und Authentifizierungstoken

14

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:

      • Verwenden Sie zunächst das Facebook iOS SDK, um eine FBSession zu öffnen
      • Wenn dies erledigt ist und die App die Kontrolle zurückerhält, sollte es eine Möglichkeit geben, eine Facebook-ID für diesen Benutzer zu erhalten. Ich würde diese ID alleine an meinen OAuth2-Endpunkt senden, mit einem Erweiterungsgewährung , das von meinem Server als "Verwenden einer FB-Benutzer-ID" verstanden wird.

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:

  • Zeige ein Login-Formular mit einem "Facebook Login" -Button
  • Wenn diese Anmeldemethode ausgewählt ist, verhalten Sie sich wie das Facebook SDK: Öffnen Sie eine Webseite von Ihrem Authentifizierungsserver, die die Facebook-Anmeldung einleitet.
  • Sobald sich der Benutzer angemeldet hat, verwendet Facebook Ihre Weiterleitungs-URL zur Bestätigung. diesen URL auf einen anderen Endpunkt Ihres Authentifizierungsservers verweisen lassen (möglicherweise mit einem zusätzlichen Parameter, der angibt, dass der Anruf von einer App kam?)
  • Wenn der Authentifizierungsendpunkt gefunden wird, kann die Authentifizierung den Benutzer sicher identifizieren, seine FB-Benutzer-ID/FB-Sitzung beibehalten und ein Zugriffstoken unter Verwendung eines benutzerdefinierten URL-Schemas an Ihre App zurückgeben, wie es das Facebook-SDK tun würde

Sieht besser aus?

5
Olivier Lance