Wie geht man mit der Authentifizierung (z. B. lokal und Facebook) über passport.js über eine RESTful-API anstatt über eine Weboberfläche um?
Besondere Bedenken bestehen darin, die Übergabe von Daten aus Rückrufen an eine RESTful-Antwort (JSON) im Vergleich zur Verwendung eines typischen res.send ({data: req.data}) zu behandeln und einen anfänglichen / login-Endpunkt einzurichten, der an Facebook umleitet (/ login kann nicht sein) Zugriff über AJAX, da es sich nicht um eine JSON-Antwort handelt - es handelt sich um eine Weiterleitung zu Facebook mit einem Rückruf).
Ich habe https://github.com/halrobertson/test-restify-passport-facebook gefunden , aber ich habe Probleme, es zu verstehen.
Wie speichert passport.js außerdem die Authentifizierungsdaten? Der Server (oder ist es ein Dienst?) Wird von MongoDB unterstützt, und ich würde erwarten, dass Anmeldeinformationen (Login & Salted Hash von pw) dort gespeichert werden, aber ich weiß nicht, ob passport.js über diese Art von Funktion verfügt.
quelle
passport-facebook
. Nachdem Sie dies zum Laufen gebracht haben, müssen Sie zunächst verstehen, wie Passport funktioniert und wie Anmeldeinformationen gespeichert werden. Einhaken es Restify oben ( siehe hier , um eine aktualisierte Version des von Ihnen erwähnen) würde einer der letzten Schritte sein (oder Sie können die REST - Schnittstelle in Express implementieren).Antworten:
Hier werden viele Fragen gestellt, und obwohl die Fragen im Kontext von Node und passport.js gestellt werden, geht es bei den eigentlichen Fragen eher um den Workflow als darum, wie dies mit einer bestimmten Technologie geschehen soll.
Verwenden wir das @ Keith-Beispiel-Setup, das für zusätzliche Sicherheit etwas modifiziert wurde:
https://example.com
dient einer einseitigen Javascript-Client-Apphttps://example.com/api
bietet Serverunterstützung für Rich Client-Appshttps://example.com/api
https://example.com/api
aber nichts über den Webserver unter wissenhttps://example.com
.Beachten Sie, dass ich sicheres HTTP verwende. Dies ist meiner Meinung nach ein Muss für jeden Dienst, der offen verfügbar ist, da vertrauliche Informationen wie Kennwörter und Autorisierungstoken zwischen Client und Server übertragen werden.
Authentifizierung mit Benutzername / Passwort
Schauen wir uns zunächst an, wie die einfache alte Authentifizierung funktioniert.
https://example.com
https://example.com/api
, um die benutzerspezifischen Daten zu erhalten, die auf der Seite gerendert werden sollen. Jede einzelne Anfrage sie an den Webdienst sendet den Benutzernamen und das Passwort enthalten, möglicherweise in Form von HTTP - Basic - Authentifizierung, da der Dienst wird RESTful nicht erlaubt ist , Client - Zustand von einer Anfrage zur nächsten beizubehalten. Da sich der Webdienst auf sicherem HTTP befindet, wird das Kennwort während der Übertragung sicher verschlüsselt.https://example.com/api
empfängt eine Reihe von Einzelanforderungen mit jeweils Authentifizierungsinformationen. Der Benutzername und das Kennwort in jeder Anforderung werden mit der Benutzerdatenbank verglichen. Wenn sie als korrekt befunden werden, wird die angeforderte Funktion ausgeführt und die Daten werden im JSON-Format an den Client zurückgegeben. Wenn Benutzername und Passwort nicht übereinstimmen, wird ein Fehler in Form eines 401-HTTP-Fehlercodes an den Client gesendet.Der wichtige Aspekt dieses Beispiels ist, dass RESTful-Webdienste bei jeder Anforderung eine Authentifizierung erfordern .
Eine zusätzliche Sicherheitsebene in diesem Szenario würde zusätzlich zur Benutzerauthentifizierung die Berechtigung für Clientanwendungen hinzufügen. Wenn beispielsweise der Webclient, iOS- und Android-Apps den Webdienst verwenden, möchte der Server möglicherweise wissen, welcher der drei Clients der Client einer bestimmten Anforderung ist, unabhängig davon, wer der authentifizierte Benutzer ist. Dadurch kann Ihr Webdienst bestimmte Funktionen auf bestimmte Clients beschränken. Hierfür können Sie API-Schlüssel und Geheimnisse verwenden. In dieser Antwort finden Sie einige Ideen dazu.
Facebook-Authentifizierung
Der obige Workflow funktioniert nicht für Facebook Connect, da die Anmeldung über Facebook einen Dritten hat, Facebook selbst. Für den Anmeldevorgang muss der Benutzer auf die Facebook-Website weitergeleitet werden, auf der Anmeldeinformationen außerhalb unserer Kontrolle eingegeben werden.
Mal sehen, wie sich die Dinge ändern:
https://example.com
https://example.com/auth/facebook
.https://example.com/auth/facebook
Route wird von passport.js verwaltet (siehe Dokumentation ).https://example.com/auth/facebook/callback
https://example.com/auth/facebook/callback
Route ruft die Rückruffunktion auf, die das Facebook-Zugriffstoken und einige Benutzerinformationen von Facebook empfängt, einschließlich der E-Mail-Adresse des Benutzers.https://example.com/api
enthalten das Facebook-Zugriffstoken zur Authentifizierung oder das eigene Zugriffstoken der Anwendung, das aus dem Facebook-Token über eine Funktion "get_access_token" in der REST-API generiert wird.Ich hoffe, dies beantwortet die meisten Fragen. Natürlich können Sie Facebook durch Twitter, Google oder einen anderen OAuth-basierten Authentifizierungsdienst ersetzen.
Es würde mich interessieren, ob jemand einen einfacheren Weg hat, damit umzugehen.
quelle
Every single request they send to the web service will include the username and password
und doch sagst duyou can have a "get_access_token" function in your RESTful service
. Es scheint widersprüchlich zu sagen, dass REST zustandslos sein muss, aber das Speichern der Zugriffstoken auf der Serverseite ist in Ordnung, da das Speichern von Zugriffstoken bedeutet, dass der Server jetzt statusbehaftet ist. Ich würde mich über eine Klarstellung oder Begründung in diesem Zusammenhang freuen. Vielen Dank! :)Ich schätze die Erklärung von @ Miguel mit dem vollständigen Ablauf in jedem Fall sehr, aber ich möchte einige zum Facebook-Authentifizierungsteil hinzufügen.
Facebook stellt ein Javascript-SDK zur Verfügung, mit dem Sie das Zugriffstoken direkt auf Client-Seite abrufen können. Dieses wird dann an den Server übergeben und zum weiteren Abrufen aller Benutzerinformationen von Facebook verwendet. Sie brauchen also grundsätzlich keine Umleitungen.
Darüber hinaus können Sie denselben API-Endpunkt auch für mobile Anwendungen verwenden. Verwenden Sie einfach das Android / iOS SDK für Facebook, holen Sie sich das Facebook access_token auf der Client-Seite und übergeben Sie es an den Server.
Die in Bezug auf stateless Natur wie erläuterte, wenn get_access_token verwendet wird , ein Token und an den Client zu erzeugen, wird dieses Token auch auf dem Server gespeichert. Es ist also so gut wie ein Sitzungstoken und ich glaube, das macht es zustandsbehaftet?
Nur meine 2 Cent ..
quelle
Hier ist ein großartiger Artikel, mit dem ich mich authentifizieren kann:
Einfache Knotenauthentifizierung: Setup und lokal
quelle