以下是我使用speakeasy包的一次性OTP(一分钟后过期)的实现
var secret = speakeasy.generateSecret({length: 20}).base32;
var token = speakeasy.totp({
secret: secret,
encoding: 'base32',
time:60
});
console.log('OTP',token);
验证令牌
var verified = speakeasy.totp.verify({
secret: req.params.secret,
encoding: 'base32',
token: req.params.token,
time:60
});
但OTP永不过期,console.log(verified)
总是在到期时间后返回true
答案 0 :(得分:0)
在您的令牌定义中:
var token = speakeasy.totp({
secret: secret,
encoding: 'base32',
time:60
});
将time
选项更改为step
选项,然后重试:
var token = speakeasy.totp({
secret: secret,
encoding: 'base32',
step:300 //time in seconds
});
请查看这两个选项,并根据您的情况决定哪一个适合。如果time
是您的正确选项,则必须以秒为单位指定纪元时间。 60
在这里似乎不是正确的价值。 time
的有效值可以是1495176700
。
提供您希望令牌过期的纪元时间,然后重试。希望它能适应这些变化。