Electron集成Google Authenticator验证始终返回false的问题求助
Electron集成Google Authenticator验证始终返回false的问题求助
各位大佬好,我现在在开发一个Electron应用,想集成Google Authenticator的双因素验证功能。目前二维码生成的部分已经跑通了,用户能正常扫码把应用添加到Authenticator里,但当用户输入验证码按回车验证时,我的验证逻辑始终返回false,试了好多次都没解决,实在摸不着头脑,麻烦帮忙看看代码哪里有问题?
先贴一下我目前的代码:
渲染进程代码(负责展示二维码和处理用户输入)
document.addEventListener('DOMContentLoaded', async function() { const image = document.getElementById('qrcode-image'); // 页面上的img元素 const data = await ipcRenderer.invoke('generate-qrcode') image.setAttribute("src", data) }) // 监听用户输入验证码的回车事件 const codeInput = document.getElementById('auth-code'); codeInput.addEventListener('keydown', async function(e) { if (e.key === 'Enter') { const inputCode = e.target.value.trim(); const isValid = await ipcRenderer.invoke('verify-auth-code', inputCode); if (isValid) { console.log('验证成功'); // 后续的成功逻辑 } else { console.log('验证失败,请重新输入'); // 提示用户错误 } } })
主进程代码(负责生成secret、二维码和验证逻辑)
const speakeasy = require('speakeasy'); const qrcode = require('qrcode'); const { ipcMain } = require('electron'); // 生成secret let secret = speakeasy.generateSecret({ name: "Auth" }) console.log('生成的secret ASCII:', secret.ascii); // 生成二维码的IPC处理 ipcMain.handle('generate-qrcode', async () => { const data = await new Promise((resolve, reject) => { qrcode.toDataURL(secret.otpauth_url, (err, data) => { if (err) { reject(err) } else { resolve(data) } }) }) return data }) // 验证验证码的IPC处理 ipcMain.handle('verify-auth-code', async (_, code) => { // 这里我一开始用的是secret.ascii,后来换成base32还是不行 const isValid = speakeasy.totp.verify({ secret: secret.base32, encoding: 'base32', token: code }); console.log('验证结果:', isValid); return isValid; })
我自己排查的几个点,但还是没解决:
- 我怀疑是不是secret的问题?比如我是不是应该把secret持久化?但我测试的时候都是同一个会话,没重启应用,理论上secret应该是一致的啊
- 验证参数是不是有问题?比如有没有漏传什么参数?我看speakeasy的文档,totp.verify只需要secret、encoding和token,这三个我都传了
- 会不会是时间同步的问题?Authenticator是基于时间的,我本地时间和标准时间会不会差太多?我看了下,本地时间和网络时间差个一两分钟,不知道会不会影响?
有没有大佬帮我看看哪里可能出错了?万分感谢!
备注:内容来源于stack exchange,提问作者ivox
相关产品推荐
相关产品推荐

