node.js - 护照-totp 认证的认证问题
问题描述
我正在尝试使用护照策略 TOTP,但我遇到了始终被拒绝的身份验证部分的问题。我可以使用用户名和密码登录,通过Google Authenticator应用程序生成用于生成令牌的二维码,但是当通知代码令牌时,身份验证被拒绝。密钥存储在 Redis 上。这是我的代码:
base32 = require('thirty-two')
const passport = require('passport')
const TotpStrategy = require('passport-totp').Strategy
passport.use(new TotpStrategy(
async function (user, done) {
const email = user.emails[0].value
try {
const key = await client.get(email)
console.log('estratégia', key)
if (!key) {
return done(new Error(('Sem Chave')))
} else {
return done(null, key, 30)
// return done(null, key, 30)
}
} catch (err) {
console.log(err)
}
}
))
const randomKey = function (len) {
const buf = []
const chars = 'abcdefghijklmnopqrstuvwxyz0123456789'
const charlen = chars.length
for (let i = 0; i < len; ++i) {
buf.push(chars[getRandomInt(0, charlen - 1)])
}
return buf.join('')
}
function getRandomInt (min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min
}
exports.getToken = async (req, res) => {
console.log('Tela de Token ')
const email = req.user.emails[0].value
const chave = await client.get(email)
console.log('Controller', chave)
if (chave) {
const encodedKey = base32.encode(chave)
console.log(encodedKey)
let url = null
const qrData = ('otpauth://totp/' + req.user.emails[0].value + '?secret=' + encodedKey)
url = 'https://chart.googleapis.com/chart?chs=166x166&chld=L|0&cht=qr&chl=' + qrData
res.render('token', {
// In case of loss of key, change the value from "QR" to "url".
qr: null,
user: req.user,
key: encodedKey,
pageTitle: 'Token',
path: '/token'
})
} else {
const secret = randomKey(10)
const encodedKey = base32.encode(secret)
try {
await client.set(email, secret)
console.log(chave)
let url = null
const qrData = ('otpauth://totp/' + req.user.emails[0].value + '?secret=' + encodedKey)
url = 'https://chart.googleapis.com/chart?chs=166x166&chld=L|0&cht=qr&chl=' + qrData
res.render('token', {
qr: url,
user: req.user,
key: encodedKey,
pageTitle: 'Token',
path: '/token'
})
} catch (err) {
console.log(err)
}
}
}
router.post('/token',
passport.authenticate('totp', { failureRedirect: '/token' }),
function (req, res) {
req.session.secondFactor = 'totp'
res.redirect('/')
}
)
正如我所说,我在使用 passport.authenticate 函数时遇到问题,该函数总是拒绝在 Google Authenticator 中输入的代码。(完整的代码没有被告知,只有那些提到 TOTP 的,但如果你需要帮助,尽管问我)。感激的。
解决方案
推荐阅读
- excel - 插入包含过滤器公式提供的值的表
- python - 有没有办法检查 asyncpg 运行的查询字符串?
- azure - Azure 门户中的 Azure 存储帐户连接字符串在哪里?
- javascript - 在 WordPress 中将字段值设置为 PDF
- javascript - 尝试使用 javascript 或 JQuery 根据 URL 中的字符串查询隐藏按钮元素。URL 有一个“&”和两个“=”来分割
- github - Github OAuth 授权访问控制
- serial-port - 蛮力或计算串行 RS232 校验和
- firebase - 计算firebase数据库Flutter中的孩子数
- xdebug-profiler - Windows 上的 xdebug 3 配置文件生成完整的文件路径,混淆 QCachegrind
- javascript - javascript中的onclick事件在图像的非透明部分