Wie sollte ein Facebook-Benutzerzugriffstoken auf der Serverseite konsumiert werden?

Vorwort

Bin ich die Entwicklung mehrerer web-services und eine Handvoll clients (web-app, mobile, etc.) die Schnittstelle mit Sprach-Dienste über HTTP(s). Meine aktuelle Arbeitselement ist der Entwurf einer Authentifizierungs-und Autorisierungs-Lösung für das Produkt. Ich habe beschlossen, das zu nutzen, externen identity Provider wie Facebook, Google, Microsoft, Twitter und dergleichen, die für die Authentifizierung.

Ich versuche, das problem zu lösen, "wenn eine Anfrage kommt auf meinen server, wie kann ich wissen, wer der Benutzer ist und wie kann ich sicher sein?". Mehr Fragen unter...

Anforderungen

  1. Verlassen sich auf externe Identitäten zu zeigen, wer ich bin den Umgang mit ('userId' im Grunde ist alles, was ich kümmern).
  2. Sollte das system verwenden token-basierte Authentifizierung (im Gegensatz zu cookies, zum Beispiel-oder basic-auth).

    Ich glaube, dies ist die richtige Wahl für die Skalierung auf mehrere clients und Servern, während die Bereitstellung von loser Kopplung.

Workflow

Basierend auf meiner Lektüre und Verständnis von token-basierte Authentifizierung, die folgende ist, wie ich mir den workflow zu werden. Wir konzentrieren uns jetzt auf Facebook in einem web-browser. Meine Vermutung ist, dass andere äußere Identität sollten die Anbieter haben ähnliche Funktionen, obwohl ich noch nicht bestätigt, nur noch.

Hinweis, als zu schreiben, ich stützt die folgenden aus der Facebook login version 2.2

  1. Client: Initiiert login auf Facebook mit dem JavaScript-SDK
  2. Facebook: Benutzer authentifiziert und genehmigt die app-Berechtigungen (access-Benutzers öffentliches Profil zum Beispiel)
  3. Facebook: Sendet die Antwort zum client enthält Zugriffstoken des Benutzers, ID und unterschriebenen Antrag
  4. Client: Speichert Benutzer-Zugriffstoken in der browser-Sitzung (bearbeitet von-SDK bequem)
  5. Client: Stellt eine Anfrage auf meiner web-service für eine sichere Ressource, die durch das senden entlang der Zugriffstoken des Benutzers, der in der authorization-header + die user - ID (in der benutzerdefinierten Kopfzeile potenziell)
  6. Server: Liest user-access-token-request-header und leitet die überprüfung durch das senden einer Anfrage an die debug_token graph-API von Facebook
  7. Facebook: Antwortet der server mit dem user access token info (enthält eine Anwendungs-id und Benutzer-id)
  8. Server: Vervollständigt die überprüfung des Tokens durch den Vergleich der Anwendungs-id, was zu erwarten ist (sich selbst bekannt) und die Benutzer-id, was gesendet wurde, auf der client-Anfrage
  9. Server: Antwortet dem client mit der angeforderten Ressource (vorausgesetzt, die glücklich Autorisierung Pfad)

Ich mir vorstelle, die Schritte 5-9 werden würde, wiederholt sich für nachfolgende Anfragen an den server (während das Zugriffstoken des Benutzers gültig ist, nicht abgelaufen ist, kann entzogen FB-Seite, app-Berechtigungen geändert, etc.)

Hier ist ein Diagramm zu helfen, gehen zusammen mit den Schritten. Bitte verstehe das system ist nicht eine single page application (SPA). Die web-services erwähnt werden, sind API-Endpunkte dienen JSON-Daten zurück an die clients im wesentlichen; Sie sind nicht dazu dient HTML/JS/CSS (mit Ausnahme der web-client-Server).

Wie sollte ein Facebook-Benutzerzugriffstoken auf der Serverseite konsumiert werden?

Fragen

  1. Zuerst und vor allem, gibt es eklatante Lücken /Grube fällt mit dem beschriebenen Ansatz, der auf mein Vorwort und Anforderungen?
  2. Führt eine ausgehende Anfrage an Facebook zur überprüfung der Zugangs-token (Schritte 6-8 oben) pro client-Anfrage erforderlich /empfohlen?

    Weiß ich zumindest, ich muss überprüfen Sie die access-token aus der client-Anfrage. Allerdings ist die empfohlene Vorgehensweise für eine nachträgliche Prüfung nach dem ersten ist mir unbekannt. Wenn gibt es typische Muster, ich bin daran interessiert zu hören, über Sie. Ich verstehe, Sie kann abhängig von der Anwendung basierend auf meinen Anforderungen, aber ich weiß einfach nicht, was Sie suchen, noch. Ich werde in der due-diligence-einmal habe ich eine Grundidee.

    Beispielsweise möglich Gedanken:

    • Hash access token + userId-pair-Mädchen nach der ersten Prüfung abgeschlossen ist, und speichern Sie es in einem verteilten cache (zugänglich von allen web-Servern) mit Ablauf gleich access Token. Bei nachfolgenden Anfragen von den clients, hash access token + userId-pair-Mädchen und überprüfen Ihre Existenz in den cache. Wenn vorhanden, dann fordern berechtigt ist. Ansonsten erreichen auf Facebook Diagramm-API, um zu bestätigen, die access token. Ich nehme an, dass diese Strategie könnte machbar sein, wenn ich HTTPS verwenden (was ich wird). Allerdings, wie kommt die Leistung vergleichen?
    • Die akzeptierten Antworten in diese StackOverflow-Frage empfiehlt die Erstellung einer benutzerdefinierten access-token, nachdem die erste überprüfung der Facebook-user-token ist abgeschlossen. Das custom token würde dann an den client gesendet werden für nachfolgende Anfragen. Ich wundere mich, wenn dieses ist komplexer als die obige Lösung allerdings. Dies würde erfordern, die Umsetzung meiner eigenen Identity Provider (sowas möchte ich vermeiden, denn ich möchte für die Verwendung von externen identity Providern in Erster Linie...). Gibt es irgendein Verdienst zu diesem Vorschlag?
  3. Ist die signedRequest Bereich vorhanden, auf die Antwort in Schritt #3 oben (erwähnt hier), entspricht die signierte Anfrage-parameter hier in die 'Spiele-canvas-login" fließen?

    Scheinen Sie zu sein, angedeutet, als äquivalent, da die erste links, um die letzteren in der Dokumentation. Aber ich bin überrascht, dass die überprüfung der Strategie erwähnt, auf der Spiele-Seite ist nicht erwähnt in den 'manuell erstellen eine login-flow" - Seite der web-Dokumentation.

  4. Wenn die Antwort auf #3 ist 'ja', können die gleiche Identität Bestätigung Strategie der Decodierung der Signatur und im Vergleich zu dem, was erwartet werden verwendet, auf der server-Seite?

    Wie sollte ein Facebook-Benutzerzugriffstoken auf der Serverseite konsumiert werden?

    Frage ich mich, ob diese genutzt werden kann, anstatt ein ausgehender Anruf an die debug_token graph API (Schritt #6 oben), um zu bestätigen, das access token als empfohlen hier:

    Wie sollte ein Facebook-Benutzerzugriffstoken auf der Serverseite konsumiert werden?

    Natürlich, um den Vergleich auf der server-Seite, die signierte Anfrage Teil würde gesendet werden müssen, zusammen mit der Anfrage an den server (Schritt 5 oben). Neben der Machbarkeit, ohne die Sicherheit, Frage ich mich, wie man die performance vergleichen zu machen, die für ausgehende Anrufe.

  5. Während ich dabei bin, in welchem Szenario /für welche Zwecke würden Sie weiterhin im Zugriffstoken eines Benutzers zu einer Datenbank zum Beispiel?
    Ich sehe kein Szenario, wo ich brauchen würde, um dies zu tun, aber darf ich sein Blick auf etwas. Ich bin neugierig, war einige häufige Szenarien, die möglicherweise zu Funken einige Gedanken.

Dank!

Kommentar zu dem Problem

InformationsquelleAutor der Frage Scott Lin | 2014-12-04

Schreibe einen Kommentar