def authenticate(self, request=None, assertion=None): """Authentication based on BrowserID assertion. ``django.contrib.auth`` backend that is SASL and BrowserID savy. Uses session to maintain assertion over multiple requests. """ if not (request and assertion): return None store_assertion(request, assertion) directory = UserSession(request) with statsd.timer('larper.sasl_bind_time'): (registered, details) = _get_registered_user(directory, request) if registered: person = directory.get_by_unique_id(details) defaults = dict(username=person.username, first_name=person.first_name, last_name=person.last_name, email=person.username) user, created = User.objects.get_or_create( username=person.username, defaults=defaults) if created: user.set_unusable_password() user.save() return user return None
def _view(request, *args, **kwargs): (asst_hsh, assertion) = get_assertion(request) if not asst_hsh or not assertion: log.info("No assertion in session") return _redirect(request, login_url, redirect_field_name) try: directory = UserSession(request) (registered, unique_id) = directory.registered_user() except ldap.OTHER: statsd.incr('browserid.session_timedout') log.info( "Backend session timed out, clearing session assertion") return _redirect(request, login_url, redirect_field_name) return view_func(request, *args, **kwargs)