Seite 1 von 1
Login / Authorisation mit Werkzeug, FastCGI
Verfasst: Dienstag 28. Oktober 2008, 16:46
von bake
Hi,
ich arbeite derzeit mit Werkzeug und FastCGI und möchte nun, dass der Benutzer sich einloggen muss, bevor er die eigentlichen Webseite(n) sieht.
Bietet Werkzeug Bordmittel um ein Login zu realisieren? Habe mir die Authorization Class angeguckt, werde aber nicht ganz schlau wie ich das ganze realisiere... Gibt es irgendwo eine Beispielimplementierung die ich mir anschauen kann um das ganze zu verstehen? Weiter unten die dispatch funktion aus der wsgiapp.py (falls für die Antwort benötigt):
Code: Alles auswählen
def dispatch(self, environ, start_response):
local.application = self
request = Request(environ)
local.url_adapter = adapter = url_map.bind_to_environ(environ)
try:
endpoint, values = adapter.match()
handler = getattr(views, endpoint)
response = handler(request, **values)
except NotFound, e:
response = views.not_found(request)
response.status_code = 404
except HTTPException, e:
response = e
return ClosingIterator(response(environ, start_response),
[local_manager.cleanup])
Verfasst: Dienstag 28. Oktober 2008, 16:51
von derdon
Verfasst: Dienstag 28. Oktober 2008, 17:05
von bake
Öhm ja... Oh Gott... Tomaten auf den Augen und so...

Vielen Dank!
Verfasst: Dienstag 28. Oktober 2008, 17:25
von lunar
Alternativ kannst du auch authkit verwenden. Das unterstützt alle möglichen Authentifizierungsverfahren, und lässt sich als WSGI-Middleware in jede WSGI-Anwendung einbinden. Außerdem bietet es eine API zum Verwalten von Nutzern, Gruppen und Rollen.
Für einfache Anwendungen ist das sicherlich Overkill, aber wenn's größer werden soll, spart man sich ein wenig Arbeit.
Verfasst: Dienstag 28. Oktober 2008, 17:51
von Y0Gi
Die Wahl bzw. Nutzung einer WSGI-Middleware hängt natürlich davon ab, inwieweit du evtl. bereits vorhandene Benutzerstrukturen und -mechanismen mit dem Login verheiraten willst.
Verfasst: Mittwoch 5. November 2008, 09:11
von bake
Nun habe ich endlich Zeit gefunden mich mit der Authentifizierung zu beschäftigen. Habe versucht, dass httpbasicauth example von pocoo zum laufen zu bringen, irgendwie scheiter ich...
Er fragt zwar den Username und das Password ab, leitet mich aber nach der Eingabe nicht weiter, sondern fragt sofort wieder nach einem user und password ...
Code: Alles auswählen
class YouConduct(object):
def __init__(self):
local.application = self
self.users = {'user1': 'password1', 'user2': 'password2'}
self.realm = 'login required'
self.dispatch = SharedDataMiddleware(self.dispatch, {
'/shared': SHARED_PATH,
'/memberportraits': MEMBERPORTRAITS_PATH
})
def check_auth(self, username, password):
return username in self.users and self.users[username] == password
def auth_required(self, request):
return Response('Could not verify your access level for that URL.\n'
'You have to login with proper credentials', 401,
{'WWW-Authenticate': 'Basic realm="%s"' % self.realm})
def dispatch(self, environ, start_response):
local.url_adapter = adapter = url_map.bind_to_environ(environ)
try:
endpoint, values = adapter.match()
handler = getattr(views, endpoint)
response = handler(request, **values)
except NotFound, e:
response = views.not_found(request)
response.status_code = 404
except HTTPException, e:
response = e
return ClosingIterator(response(environ, start_response),
[local_manager.cleanup])
def __call__(self, environ, start_response):
local.application = self
request = Request(environ)
auth = request.authorization
if not auth or not self.check_auth(auth.username, auth.password):
response = self.auth_required(request)
return response(environ, start_response)
else:
return self.dispatch(environ, start_response)
Verfasst: Mittwoch 5. November 2008, 09:30
von veers
Ich verwende
barrel für Authentifikation mit werkzeug. Das funktioniert gut.
Verfasst: Mittwoch 5. November 2008, 12:51
von lunar
Nutz doch mal das logging-Modul und lass dir die Parameter für die einzelnen Funktionen und die Header des Requests ausgeben. Dann dürftest du recht schnell sehen, wo es hakt.
Im Übrigen hat Werkzeug auch ein Mixin, um dem Authenticate-Header komfortabel anzusprechen, das musst du nicht selber tun.
Verfasst: Montag 17. November 2008, 15:21
von OverNord
Ich habe mal etwas mit dem httpbasicauth example von pocoo rumgespielt, was auf dem Developmentserver auch gut funktionierte, als ich das ganze dann mal auf meinem Apache getestet habe, war Request.authorization = None, weiß jemand warum das so ist?
Verfasst: Montag 17. November 2008, 16:07
von gerold
Hallo!
Irgendwer hat hier im Forum mal geschrieben, dass Authentifizierung NICHT über FastCGI und CGI funktioniert. Wenn du also Authentifizierung hinter einem Apachen haben möchtest, dann kannst du die Apache-Authentifizierung verwenden.
mfg
Gerold

Verfasst: Montag 17. November 2008, 16:10
von lunar
Wenn du flup als WSGI-Gateway nutzt, dann ist die Ursache ein Fehler in flup. Es gibt den entsprechenden Header nicht – wie von WSGI verlangt – als "HTTP_AUTHORIZATION" weiter, sondern als "Authorization". Die Lösung ist eine Middleware, die die Schlüssel im environ-Mapping gerade biegt.
Ausführlich steht das im
Werkzeug-Wiki.
@gerold
Es funktioniert, nur eben nicht ohne Hack.
Verfasst: Montag 17. November 2008, 16:28
von OverNord
Ich nutze mod_wsgi.
Verfasst: Montag 17. November 2008, 16:30
von lunar
Hast du mod_wsgi auch so konfiguriert, dass es die Header durchreicht? Wenn ja, probiere doch mal die Middleware im Wiki-Artikel aus und schreibe mal das "environ"-Mapping mit einer vorgeschalteten Middleware ins Log, um zu schauen, ob der Header überhaupt ankommt, oder ob er nur im falschen Schlüssel steht.
Verfasst: Montag 17. November 2008, 16:55
von OverNord
So, hab das Problem behoben, musste nur WSGIPassAuthorization auf on setzen. Danke, für die Hilfe.