2016-07-20 7 views
6

Ich entschuldige mich im Voraus für eine eher kryptische Frage. Allerdings habe ich es trotz viel Material nicht verstanden. Es wäre großartig, wenn Sie das ein wenig beleuchten könnten.Wie ist Flask-Login's request_loader mit user_loader verbunden?

Was ist der Zweck eines request_loaders in flask-login? Wie interagiert es mit dem user_loader Dekorator?

Wenn ich ein tokenbasiertes Authentifizierungssystem verwende (ich plane, das Token an mein angularJS-Frontend zu senden, das Token dort zu speichern und dieses Token im Authorization-Token-Header zu senden), brauche ich einen request_loader oder will ein user_loader (wo ich den Auth-Header überprüfe und sehe, ob der Benutzer existiert) genügt?

+0

Ich interessiere mich für das gleiche tun –

+0

„Ich habe das Token an meinem AngularJS Frontend über das Senden bin die Planung, das Token dort zu speichern und in den Zulassungs Token-Header, dass die Token Senden“ Ich interessiere mich für die dabei gleiche Sache! Können Sie erläutern, wie Sie (d) request_loader verwenden, um dies zu erreichen? Verwendet Angulars $ http automatisch dieselben Cookies wie andere Browseranforderungen? Müssen wir den "Token an mein angularJS Frontend senden" -Teil tun? Mein Problem ist, dass die Sitzungs-ID in einer anderen Kopfzeile oder einem anderen Parameter gesendet werden kann (weshalb ich vielleicht request_loader brauche) - aber wird ein eingeloggter Browser sie immer noch automatisch senden? –

+0

Hallo Zach, Sorry für die verzögerte Antwort. Von dem, was ich verstehe, müssen Sie nicht wirklich Benutzer- und Anforderungsloader haben. Ein Benutzerladeprogramm ist sehr einfach. Es prüft die user_id, die der Sitzung zugeordnet ist, und prüft, ob diese user_id in Ihrer Benutzerdatenbank existiert und sich authentifiziert. Ein Request-Loader prüft den Request Authorization Header und führt die gleiche Authentifizierung durch. Daher benötigen Sie für die meisten Anwendungen, die irgendeine Art von Benutzersitzungsverwaltung haben, keinen Anforderungslader. Sie müssen keine Tokens senden ... Flask und eckige js verwalten diese automatisch mit user_loader – galeej

Antwort

2

aus dem Kolben-Anmeldung documentation:

Manchmal möchten Sie Benutzer anmelden ohne Cookies, wie die Verwendung von Header-Werte oder einen API-Schlüssel als Abfrage Argument übergeben werden. In diesen Fällen, sollten Sie den Rückruf request_loader verwenden. Dieser Callback sollte sich genauso verhalten wie Ihr user_loader Rückruf, außer dass er die Flask-Anfrage statt einer user_id akzeptiert.

Also, um Ihre Frage zu beantworten, dienen beide die gleiche Funktion für Flask-Login. Sie werden beide zum Laden des Benutzers verwendet. request_loader ist jedoch für benutzerdefinierte Anmeldungen geeignet.

Hier ist ein großes Tutorial fand ich, dass request_loader Vorteil Token basierende Authentifizierung zu nehmen nutzt (Der Pfosten ist nicht mein eigener, ich bin den Link nur Sharing): http://gouthamanbalaraman.com/blog/minimal-flask-login-example.html

0

Benutzer zu überprüfen, mit Flask-Anmeldung der Sitzungs_ID Für Frontend-Anforderungen über Angular müssen Sie das Konfigurationsflag withCredentials auf true setzen.

Das heißt, wenn Sie mit Angular des $http.post(url,data [,config]) oder $http.get(url [,config]), stellen Sie sicher, dass das config Objekt die Eigenschaft withCredentials Satz auf true enthält. Dadurch wird der Browser angewiesen, seine Cookies auf die gleiche Weise zu verwenden wie für einen vollständigen Seitenaufruf.

Zum Beispiel

$http.post('/api/login',{username:'myusername',password:'mypassword'},{withCredentials:true}) 

wird /api/login Route die Daten {username:'myusername',password:'mypassword'} auf Ihrer Website/App post und, wenn Sie Flask-Anmeldung verwenden und angemeldet sind, werden Flask wissen.

können Sie dieses Verhalten eingestellt für alle$http Service-Anfragen von

$httpProvider.defaults.withCredentials=true 

irgendwo in Ihrer Anwendung einstellen. Derzeit habe ich diese Zeile Code in meinem app.config Block, die mir sinnvoll erscheint:

var myApp = angular.module('myApp'); 

myApp.config(function ($httpProvider) { 
    $httpProvider.defaults.withCredentials = true; 
    }); 

(Da dieser Beitrag über Flask ist, möchten Leute Formulardaten durch Angular so senden, dass es gefunden werden in request.form, die eine ähnliche Lösung hat, fyi.)

+0

Hallo Zach ... Ja. Dies funktioniert, wenn Sie einen Request Loader haben. Beachten Sie jedoch, dass der Benutzername und das Passwort für jeden sichtbar sind, der Zugriff auf die Codebasis hat (wenn Sie die Website hosten ... das ist im Grunde die ganze Welt) ... Das könnte also ein Sicherheitsrisiko darstellen (möglicherweise). – galeej

+0

Hallo @galeej, kannst du bitte mehr dazu sagen? Mein Beispiel ist völlig bizarr, ich gebe zu - ich habe während eines Logins Passzertifikate gezeigt, was eines der wenigen Male ist, dass es wenig Sinn macht, Anmeldeinformationen zu übergeben. Die von Angular mit dieser Konfiguration gesendeten Credentials sind einfach Ihre Session-ID, da sie per Flask-Login cookie-formatiert ist. E-Mail und Passwort werden also nicht in beliebigen $ http-Anrufen gesendet. Alles in allem bin ich immer noch neugierig, warum Sie vermuten, dass jemand mit Zugang zur "Codebasis" Zugang zu allen Benutzerinformationen hat und darüber hinaus, warum "die ganze Welt" das haben würde –

Verwandte Themen