Source code for django_otp.views
from __future__ import absolute_import, division, print_function, unicode_literals
from functools import partial
from django.contrib.auth import BACKEND_SESSION_KEY
from django.contrib.auth.views import login as auth_login
from django_otp import _user_is_anonymous
from django_otp.forms import OTPAuthenticationForm, OTPTokenForm
[docs]def login(request, **kwargs):
"""
This is a replacement for :func:`django.contrib.auth.views.login` that
requires two-factor authentication. It's slightly clever: if the user is
already authenticated but not verified, it will only ask the user for their
OTP token. If the user is anonymous or is already verified by an OTP
device, it will use the full username/password/token form. In order to use
this, you must supply a template that is compatible with both
:class:`~django_otp.forms.OTPAuthenticationForm` and
:class:`~django_otp.forms.OTPTokenForm`. This is a good view for
:setting:`OTP_LOGIN_URL`.
Parameters are the same as :func:`~django.contrib.auth.views.login` except
that this view always overrides ``authentication_form``.
"""
user = request.user
if _user_is_anonymous(user) or user.is_verified():
form = OTPAuthenticationForm
else:
form = partial(OTPTokenForm, user)
# A minor hack to make django.contrib.auth.login happy
user.backend = request.session[BACKEND_SESSION_KEY]
kwargs['authentication_form'] = form
return auth_login(request, **kwargs)