Nodejs集成谷歌身份验证器
google authenticator 是在服务端集成
一次性密码原理简述
一次性密码(One-Time Password,OTP),又叫做动态口令、动态验证码。是一种客户端和服务端通过分享种子密钥来进行认证的无需联网的技术。是对于常规的静态认证(用户名密码等)的补充。
一次性密码的实现最常见的有两种:
- HOTP(HMAC-Based One-Time Password Algorithm):这种实现基于 HMAC 算法的,,这种算法是双方先分享一个相同的密钥,然后设置一个同步的计数器。由于二者计数器是同步的,所以每次生成的一次性令牌也是相同的。这种方法的应用并不常见。实现规范为 RFC-4226。
- TOTP(Time-Based One-Time Password Algorithm):这种实现是基于时间的,所以就不再需要同步计数器,只需要双方的当前时间相同即可,所以这种方式更为常用。实现规范为 RFC-6238。
google 身份验证器则是使用的第二种方式。所以一个常见的误解就是,如果想要使用谷歌身份验证器,就需要调用谷歌的接口进行认证。事实上,服务端和身份认证 app 的密钥都是独立离线计算的,不需要调用任何第三方接口
安装依赖
npm install otplib --save
Nodejs端集成
import { authenticator } from 'otplib'
import QRCode from 'qrcode'
/**
* 初始化 OTP 令牌
*
* @param userName 唯一的用户名
* @param appName 项目名称
* @returns secret 需要临时缓存的种子密钥
* @returns qrcodeUrl 展示给用户的二维码 base64
*/
const createSeedSecret = async (userName, appName) => {
const secret = authenticator.generateSecret()
const googleKeyuri = authenticator.keyuri(userName, appName, secret)
const qrcodeUrl = await QRCode.toDataURL(googleKeyuri)
return { secret, qrcodeUrl }
}
参考文章
转载自:https://juejin.cn/post/7144255920195764231