PyOTP生成的2FA验证码与Google Authenticator不一致问题求助
解决Stripe 2FA验证码与Google Authenticator不一致的问题
先排查几个核心问题,对应给出修正方案:
1. URI构造的Issuer重复冲突
你当前代码在标签部分(otpauth://totp/后的内容)添加了Stripe: 前缀,同时又在参数里指定issuer=Stripe。这会导致Google Authenticator和pyotp的密钥解析逻辑出现差异——按照OTP标准,Issuer只需在参数中声明,标签部分仅保留用户邮箱即可。
修正后的URI构造代码:
from urllib.parse import quote import pyotp def makeotpauth(email, secret): otpauth = f"otpauth://totp/{quote(email)}?secret={secret}&issuer=Stripe" totp = pyotp.parse_uri(otpauth) return totp
2. 绕开URI,直接初始化TOTP对象(更可靠)
避免URI构造可能带来的编码、解析问题,直接用pyotp的TOTP类初始化,逻辑更清晰:
import pyotp def make_totp(secret): # Stripe的2FA密钥是标准base32格式,pyotp会自动兼容大小写、忽略多余空格 totp = pyotp.TOTP(secret, issuer="Stripe") return totp # 使用示例 totp = make_totp("你的Stripe 2FA原始密钥") print(totp.now())
3. 基础验证步骤
- 确认
secret是Stripe提供的原始2FA密钥,不要手动添加/删除字符、空格。 - 检查服务器时间与手机时间是否同步:验证码基于30秒时间窗口生成,两边时间差超过30秒必然导致验证码不一致。
测试时可以用totp.verify(谷歌验证码)来直接验证生成结果是否匹配,或者在同一秒内对比两边的输出值。
内容的提问来源于stack exchange,提问作者The DEV
相关产品推荐
相关产品推荐

