Wie geht man mit der Authentifizierung (z. B. lokal und Facebook) über passport.js über eine RESTful-API anstatt über eine Webschnittstelle um?
Besondere Bedenken betreffen die Weitergabe von Daten von Rückrufen an eine RESTful-Antwort (JSON) im Gegensatz zur Verwendung eines typischen res.send-Endpunkts ({data: req.data}), bei dem ein initialer/login-Endpunkt eingerichtet wird, der zu 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 Anmeldeinformationen für die Authentifizierung? Der Server (oder ist es ein Dienst?) Wird von MongoDB unterstützt, und ich würde erwarten, dass Anmeldeinformationen (Login und gesalzener Hash von pw) dort gespeichert werden, aber ich weiß nicht, ob passport.js über diese Art von Funktionen verfügt.
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 Arbeitsablauf als darum, wie dies mit einem bestimmten Element geschehen soll Technologie.
Verwenden wir das @ Keith-Beispielsetup, das aus Sicherheitsgründen ein wenig modifiziert wurde:
https://example.com
Bedient eine einseitige Javascript-Client-Apphttps://example.com/api
Bietet Serverunterstützung für die Rich-Client-Apphttps://example.com/api
https://example.com/api
, Kennen den Web-Server unter https://example.com
Jedoch nicht.Beachten Sie, dass ich sicheres HTTP verwende. Dies ist meiner Meinung nach ein Muss für jeden Service, der im Freien verfügbar ist, da vertrauliche Informationen wie Passwörter und Autorisierungstoken zwischen Client und Server übertragen werden.
Schauen wir uns zunächst an, wie die einfache alte Authentifizierung funktioniert.
https://example.com
https://example.com/api
Senden, um die benutzerspezifischen Daten zu erhalten, die auf der Seite gerendert werden sollen. Jede einzelne Anforderung, die sie an den Webdienst senden, enthält den Benutzernamen und das Kennwort, möglicherweise in Form von HTTP Basic Authentifizierung, da der REST-fähige Dienst den Client-Status von einer Anforderung bis zur nicht aufrechterhalten darf Nächster. 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 Vorteil 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 eine Clientanwendungsautorisierung hinzufügen. Wenn Sie beispielsweise den Webclient, iOS und Android Apps verwenden, die alle den Webdienst verwenden, möchten Sie möglicherweise, dass der Server weiß, welcher der drei Clients einer bestimmten Anfrage ist, unabhängig davon, wer Dies kann Ihrem Webdienst ermöglichen, bestimmte Funktionen auf bestimmte Clients zu beschränken. Hierzu können Sie API-Schlüssel und Geheimnisse verwenden (siehe diese Antwort ).
Der obige Workflow funktioniert nicht für Facebook Connect, da der Login über Facebook einen Dritten, Facebook selbst, hat. Um sich anzumelden, muss der Benutzer auf die Website von Facebook umgeleitet werden, auf der außerhalb unserer Kontrolle Anmeldeinformationen eingegeben werden.
Also mal sehen, wie sich die Dinge ändern:.
https://example.com
https://example.com/auth/facebook
Weiterleitet.https://example.com/auth/facebook
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 erhält, einschließlich der E-Mail-Adresse des Benutzers.https://example.com/api
Gesendet werden, enthalten das Facebook-Zugriffstoken zur Authentifizierung oder das Zugriffstoken der Anwendung, das aus dem Facebook-Token über eine Funktion "get_access_token" in der REST API generiert wurde.Ich hoffe, das 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.
Ich schätze die Erklärung von @ Miguel mit dem vollständigen Ablauf in jedem Fall sehr, aber ich möchte einige auf dem 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 weitergeleitet und verwendet, um alle Benutzerinformationen von Facebook weiter abzurufen. 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, besorgen Sie sich das Facebook Access_Token auf der Client-Seite und leiten Sie es an den Server weiter.
In Bezug auf die zustandslose Natur wird dieses Token auch auf dem Server gespeichert, wenn get_access_token zum Generieren eines Tokens verwendet und an den Client übergeben wird. Also ist es so gut wie ein Sitzungstoken und ich glaube, das macht es zustandsbehaftet?
Nur meine 2 Cent ..
Hier ist ein großartiger Artikel, mit dem Sie sich authentifizieren können: