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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 09:54:34