Мне всегда любопытно узнать, как можно реализовать двухфакторную аутентификацию. Итак, после стольких поисков в 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 Chart https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=
So final URI
https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth. ://totp/vaibhav.mishra2069%40gmail.com?secret=A3OBQV1TQOE2BGKF23LDBVOLHKCS64IQ

Теперь мы можем сканировать 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….. Предложения приветствуются :-)