Python pyotp在生产中有时会失败

Python pyotp在生产中有时会失败,python,Python,我正在使用。但它在生产中有时会失败。为了复制它,我编写了以下测试: import pyotp from time import sleep key = pyotp.random_base32() for i in range(10): otp = pyotp.TOTP(key).now() sleep(5) print pyotp.TOTP(key).verify(otp) 样本输出为: True False True True True True True False True

我正在使用。但它在生产中有时会失败。为了复制它,我编写了以下测试:

import pyotp
from time import sleep

key = pyotp.random_base32()
for i in range(10):
  otp = pyotp.TOTP(key).now()
  sleep(5)
  print pyotp.TOTP(key).verify(otp)
样本输出为:

True
False
True
True
True
True
True
False
True
True
我无法调试这里出了什么问题,因为它工作了8/10次。为什么它失败了2/10


谢谢,

我不熟悉
pyotp
,但在浏览时,我发现:

def timecode(self, for_time):
    i = time.mktime(for_time.timetuple())
    print(i, i/self.interval)
    return int(i / self.interval)
timecode
用于比较不同的“otp”是否相同<代码>间隔的默认值为30

可能的想法是,在30秒内,散列结果是相同的。不幸的是,这种编码方式似乎不起作用:它需要一些绝对时间(好吧,w.r.t.1970),并将其划分为30秒的间隔。
timecode
的结果是自1970年以来的30秒间隔量。当然,一旦时钟通过
*:00
*:30
,新的30秒间隔将开始,并出现不匹配。睡眠时间为5秒,10次试验,你的程序需要50秒,因此它几乎是30秒界限的2倍;因此,当四舍五入为整数值时,10分之2(将睡眠时间增加到6秒,对于较大的样本,10分之2正好)

正如我所提到的,我不知道
pyotp
,但这似乎不是故意的,应该是一个正在比较的间隔(
datetime.timedelta
)。我刚刚注意到了,所以请随意提供一个链接到这个答案

同时,也许你应该避免TOTP而使用另一个类;或者根据您的需要设置非常长的时间间隔(例如,
TOTP(key,interval=315360000)
,即10年)