#!/usr/bin/env python # -*- coding: utf-8 -*- """ Cookie Based Auth ~~~~~~~~~~~~~~~~~ This is a very simple application that uses a secure cookie to do the user authentification. :copyright: Copyright 2009 by the Werkzeug Team, see AUTHORS for more details. :license: BSD, see LICENSE for more details. """ from werkzeug.serving import run_simple from werkzeug.utils import cached_property, escape, redirect from werkzeug.wrappers import Request, Response from werkzeug.contrib.securecookie import SecureCookie # don't use this key but a different one; you could just use # os.unrandom(20) to get something random. Changing this key # invalidates all sessions at once. SECRET_KEY = '\xfa\xdd\xb8z\xae\xe0}4\x8b\xea' # the cookie name for the session COOKIE_NAME = 'session' # the users that may access USERS = { 'admin': 'default', 'user1': 'default' } class AppRequest(Request): """A request with a secure cookie session.""" def logout(self): """Log the user out.""" self.session.pop('username', None) def login(self, username): """Log the user in.""" self.session['username'] = username @property def logged_in(self): """Is the user logged in?""" return self.user is not None @property def user(self): """The user that is logged in.""" return self.session.get('username') @cached_property def session(self): data = self.cookies.get(COOKIE_NAME) if not data: return SecureCookie(secret_key=SECRET_KEY) return SecureCookie.unserialize(data, SECRET_KEY) def login_form(request): error = '' if request.method == 'POST': username = request.form.get('username') password = request.form.get('password') if password and USERS.get(username) == password: request.login(username) return redirect('') error = '

Invalid credentials' return Response(''' Login

Login

Not logged in. %s

''' % error, mimetype='text/html') def index(request): return Response(''' Logged in

Logged in

Logged in as %s

Logout ''' % escape(request.user), mimetype='text/html') @AppRequest.application def application(request): if request.args.get('do') == 'logout': request.logout() response = redirect('.') elif request.logged_in: response = index(request) else: response = login_form(request) request.session.save_cookie(response) return response if __name__ == '__main__': run_simple('localhost', 4000, application)