用passlib
生成一次性密码(符号长度为N的短信密码(的最简单方法是什么?
我现在是如何创建的:
from secrets import randbelow as secrets_randbelow
def create_secret_code() -> str: # TODO use OTP
secret_code = "".join([str(secrets_randbelow(exclusive_upper_bound=10)) for _ in range(config.SECRET_CODE_LEN)])
print_on_stage(secret_code=secret_code)
return secret_code
显然,它需要检查生成的代码是否已经不在使用中(例如,通过Redis生成(。
我的代码中也已经有了一个passlib
对象来散列和验证密码
from passlib.context import CryptContext
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
我找到了这个类,但不知道如何生成具有N个符号长度的短信密码
第页。S.我添加了一个fastapi
标签,因为我使用的是fastapi
,而passlib
是它的标准加密工具,文档
您可以使用令牌所需的位数初始化TOTP类,如下所示:
TOTP(digits=10)
下面是一个完整的例子,使用config.SECRET_CODE_LEN
:
from passlib.totp import TOTP
otp = TOTP('s3jdvb7qd2r7jpxx', digits=config.SECRET_CODE_LEN)
token = otp.generate()
print(token.token)