Как получить токен OTP для существующего пользователя в django с помощью django-two-factor-auth

Пишу селен-тесты для django. Я хочу войти в систему с OTP через пользовательский интерфейс, используя селен. После входа в систему я получаю страницу настройки, где я должен ввести 6-значный токен, сгенерированный аутентификатором Google. django-two-factor-auth хранит секретный ключ для каждого пользователя в таблице otp_totp_totpdevice. Я предполагаю, что аутентификатор Google должен использовать этот ключ для генерации токена.

Вот то, что я пробовал до сих пор: он генерирует неправильный токен.

import hmac, base64, struct, hashlib, time


def get_hotp_token(secret, intervals_no):
    key=base64.b64decode(secret,validate=True)
    msg = struct.pack(">Q", intervals_no)
    h = hmac.new(key, msg, hashlib.sha1).digest()
    o = h[19] & 15
    h = (struct.unpack(">I", h[o:o + 4])[0] & 0x7fffffff) % 1000000
    return h


def get_totp_token(secret):
    return get_hotp_token(secret, intervals_no=int(time.time()) // 30)

2 ответа

Если у нас есть user у кого еще не создан OTP, давайте создадим его:

device = user.totpdevice_set.create(name='default')

Если наш userOTP уже создан, игнорируйте вышеуказанный шаг. Чтобы получить токен, выполните следующие действия:

from django_otp.oath import totp

device = user.totpdevice_set.get()
token = totp(device.bin_key)
print(token)

Решил эту проблему с библиотекой PyOTP

когда у тебя есть устройство...

      import pyotp


uri = device.config_url
parsed_uri = pyotp.parse_uri(uri)
secret = parsed_uri.secret
otp_token = pyotp.TOTP(secret).now()
Другие вопросы по тегам