Я пытаюсь реализовать функцию добавления OTP в django-formtools и pyotp. (Я знаю, что для этого есть библиотека, но я хочу сделать это дома.)
Рабочий процесс такой.
Enter captcha -> pass? -> show otp secret
-> user enters generated otp code
-> does the code matches with the secret?
-> save secret to user model.
Сначала я создал две формы,
# forms.py
class OTPUpdateForm1(forms.Form):
captcha = CaptchaField()
class OTPUpdateForm2(OTPForm):
otp = forms.CharField()
def clean(self):
# validate otp code
, а затем создал форму.
# views.py
class NewOtpWizard(SessionWizardView):
form_list = [OTPUpdateForm1, OTPUpdateForm2]
success_url = reverse_lazy('otp-update')
def get_template_names(self):
return f'profile/editotp/step{self.steps.step}.html'
def done(self, form_list, **kwargs):
self.request.user.profile.save_totp_secret(data_for_step1['totp_secret'])
return HttpResponseRedirect(success_url)
Итак, мне нужен логический код междудве формы, то есть
- для создания секретного OPP
- для проверки OPP с секретом
- для сохранения секретного OPP
Мои вопросы
- Где вы положили код для создания секретного OTP?Я переопределил get_context_data, но я думаю, что это не то место.Это делается даже тогда, когда пользователь не может проверить otp, что приводит к новому секрету otp.
- Как передать сгенерированный секрет otp в
OTPUpdateForm2
, чтобы он мог проверять и повышать ValidationError
при неправильной проверке? - Как сохранить созданный OTP-секрет, когда
OTPUpdateForm2
прошло?
Чтобы уточнить, о чем я спрашиваю,
class MyFormView(View):
form_class = MyForm
initial = {'key': 'value'}
template_name = 'form_template.html'
def get(self, request, *args, **kwargs):
form = self.form_class(initial=self.initial)
# <these parts>
return render(request, self.template_name, {'form': form})
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST)
if form.is_valid():
# <these parts>
return HttpResponseRedirect('/success/')
# <these parts>
return render(request, self.template_name, {'form': form})
Где находятся <these parts>
в формах Django?