You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 22:01:01