0

我正在为 django 编写硒测试。我想使用 selenium 通过 UI 使用 OTP 登录用户。登录后,我进入设置页面,我应该在其中输入由谷歌身份验证器生成的 6 位令牌。django-two-factor-auth 在 table 中为每个用户存储一个密钥otp_totp_totpdevice。我假设谷歌身份验证器应该使用这个密钥来生成令牌。

以下是我迄今为止尝试过的:它生成了一个错误的令牌。

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)
4

2 回答 2

0

如果我们有一个user尚未创建 OTP 的人,让我们创建一个:

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

如果我们user已经创建了 OTP,则忽略上述步骤。要获取令牌,请执行以下操作:

from django_otp.oath import totp

device = user.totpdevice_set.get()
token = totp(device.bin_key)
print(token)
于 2020-09-15T16:27:53.350 回答
0

用PyOTP 库解决了这个问题

一旦你有了设备...

import pyotp


uri = device.config_url
parsed_uri = pyotp.parse_uri(uri)
secret = parsed_uri.secret
otp_token = pyotp.TOTP(secret).now()
于 2021-01-29T10:34:16.827 回答