相同密钥下不同服务器GoogleAuthenticator验证码不一致问题排查
问题根因与解析
该问题的根本原因是远程服务器时钟与NTP标准时间不同步,检测到的25秒时间偏移刚好触发了TOTP算法的时间窗口兼容逻辑。
为什么getCode()生成结果和手机端不一致
TOTP验证码基于30秒固定时间切片生成,服务器时间偏移25秒时已经处于当前切片和相邻切片的临界点,服务器侧生成的是偏移后时间对应切片的验证码,和同步标准时间的手机端生成的当前切片验证码自然存在差异。
为什么checkCode()校验仍然返回true
sonata Google Authenticator v2.2组件的checkCode()方法默认会校验当前时间切片、前一个时间切片、后一个时间切片共3个时间窗口的验证码,用来抵消客户端与服务端的轻微时钟偏移影响。25秒的偏移刚好落在30秒的相邻切片兼容范围内,所以手机端生成的当前切片验证码,刚好匹配服务器侧校验逻辑中的相邻切片验证码,因此返回校验通过。
同类问题排查方向
- 优先校验服务器Unix时间戳和标准时间的偏差,可在服务器执行
date +%s获取当前时间戳,和公共标准时间戳结果做对比 - 排除PHP时区配置错误问题,确认php.ini中
date.timezone配置和业务预期一致 - 排除密钥传输/存储错误问题,确认服务端和手机端绑定使用的secret完全一致
解决方案
- 配置服务器NTP时间同步服务,自动对齐标准世界时间,偏移较大时可重启服务器生效
- 若暂时无法调整服务器时钟,可在调用组件方法时手动传入校正后的时间戳参数,抵消时钟偏移影响
内容的提问来源于stack exchange,提问作者Chris-MindflowAU
相关产品推荐
相关产品推荐

