Как мне полностью аутентифицировать тестового пользователя в моих тестовых примерах с помощью django-two-factor-auth для доступа к представлениям OTPRequiredMixin?
Я пытаюсь написать тестовые примеры для моих представлений класса, которые защищены django-two-factor-auth OTPRequiredMixin. Я не уверен, как написать функцию setUp
для полной аутентификации пользователя через OTP. Я пробовал self.client.force_login()
, но когда я пытаюсь перейти по этому url в моей тестовой функции, я попадаю на страницу "Permission Denied", которая предлагает включить двухфакторную аутентификацию для пользователя, вместо ожидаемого url.
Permission Denied
Страница, которую вы запросили, принуждает пользователей к проверке с помощью двухфакторной аутентификации в целях безопасности. Вам необходимо включить эти функции безопасности, чтобы получить доступ к этой странице.
Двухфакторная аутентификация не включена для вашей учетной записи. Включите двухфакторную аутентификацию для повышения безопасности учетной записи.
Вот пример одного из представлений класса:
class ProjectCreateView(OTPRequiredMixin, CreateView):
model = Project
template_name = 'project_create.html'
fields = ['name', 'description']
А вот пример моей установки и теста:
class ProjectTestCase(TestCase):
def setUp(self):
self.user = get_user_model().objects.create(
username='jsmith', first_name='John', last_name='Smith', email='johnsmith@test.com', password='secure'
)
[...]
self.client.force_login(self.user)
def test_project_create(self):
response = self.client.post(
'/project/create/', {'name': 'Test Project', 'description': 'A basic test project'}
)
self.assertEqual(response.status_code, 200)
Заранее спасибо за вашу проницательность и мудрость!
Я потратил некоторое время, просматривая исходный код django-two-factor-auth, чтобы разобраться с этим.
В "test_with_backup_token" я нашел пример того, что, похоже, работает для меня. По сути, он создает резервный токен, а затем использует его для завершения аутентификации 2FA.
from django_otp.util import random_hex
# Create your tests here.
class WonderfulTestCase(TestCase):
def setUp(self):
# username, email, password
self.cool_user = User.objects.create_user("bob_is_cool",
"bob@hotmail.com",
"super_cool_password")
# create OTP stuff including a backup token
self.cool_user.totpdevice_set.create(name='default', key=random_hex())
device = self.cool_user.staticdevice_set.create(name='backup')
device.token_set.create(token='abcdef123')
# first auth step
response = self.client.post(reverse('two_factor:login'), {'auth-username': "bob_is_cool", 'auth-password': "super_cool_password", 'login_view-current_step': 'auth'})
# go to backup step
response = self.client.post(reverse('two_factor:login'), {'wizard_goto_step': 'backup'})
# Valid token should be accepted.
response = self.client.post(reverse('two_factor:login'), {'backup-otp_token': 'abcdef123', 'login_view-current_step': 'backup'})