Мне всегда любопытно узнать, как можно реализовать двухфакторную аутентификацию. Итак, после стольких поисков в Google и блогов я познакомился с PyOTP. PyOTP — это библиотека Python, которая может генерировать и проверять одноразовый пароль. Его можно использовать для реализации двухфакторной аутентификации или аутентификации MFA.
Как разработчик, мы обязательно следуем приведенному ниже контрольному списку, который также упоминается в документации PyOTP.
- Обеспечение конфиденциальности транспорта с помощью HTTPS
- Обеспечьте конфиденциальность секретов HOTP/TOTP, сохраняя секреты в базе данных с контролируемым доступом.
- Отказ от повторных атак путем отклонения одноразовых паролей, которые использовались клиентом
- Блокировать (ограничение скорости) атаки грубой силы на функции входа в ваше приложение.
- При внедрении нового приложения рассмотрите возможность поддержки FIDO U2F/WebAuthn в дополнение к HOTP/TOTP.
Давайте немного реализуем:
# import pyotp library import pyotp # Generate a random 32 bit value key = pyotp.random_base32() # This will give us a uri which will useful to generate QR Code qr = pyotp.totp.TOTP(key).provisioning_uri('[email protected]') print(qr)
Qr вернет значение, подобное otpauth://totp/vaibhav.mishra2069%40gmail.com?secret=A3OBQV1TQOE2BGKF23LDBVOLHKCS64IQ.
Теперь мы можем добавить этот uri с uri google chart для генерации QR-кода
URI Google Charthttps://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=
https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth. ://totp/vaibhav.mishra2069%40gmail.com?secret=A3OBQV1TQOE2BGKF23LDBVOLHKCS64IQ
So final URI
Теперь мы можем сканировать QR с помощью любого приложения Authenticator, такого как Google Authenticator, после успешного сканирования он даст нам 6-значный код, который в дальнейшем мы можем проверить как второй уровень клиента.
# enter the value recived after scanning QR Code enter_value = input("Enter the code received in mobile") # value used to generate the QR value_to_verify = pyotp.TOTP(key) #condition to verify the code if value_to_verify.verify(enter_value): print("Hurray You did it") else: print("ahh! Wrong try")
Наслаждайтесь Happy Coding….. Предложения приветствуются :-)