【笔记】Go语言基于TOTP实现2FA认证
前言
Go语言基于TOTP实现2FA认证(双因素认证、双因子认证)
源代码
- 通过
CheckCode()函数获取当前时间节点基于secret产生的密码,secretKeyBase32必须是Base32编码后的字符串
secretKeyBase32:Base32编码的字符串,用于作为计算密码的secret
1 | package main |
生成绑定二维码
- 客户端可以使用
Google Authenticator或Microsoft Authenticator等任何使用TOTP算法计算密码并30s刷新的6位数字令牌客户端 - 使用客户端扫描URL生成的二维码即可一键绑定
1:通常填写APP名称,在Microsoft Authenticator中该字段被称作账户2:通常填写用户名,非必填3:通常填写组织名,非必填<screst>:密钥,必须是经过Base32编码后的字符串,需要与服务端保持一致
1 | otpauth://totp/1:2?secret=<screst>&issuer=3 |
- 在
Google Authenticator中的样式

- 在
Microsoft Authenticator中的样式

踩坑
- 部分二维码在
Microsoft Authenticator中有效但是在Google Authenticator中无效

原因
- 二维码的
secret值末尾包含了多个=占位符
解决问题
- 去除二维码的
secret值末尾的所有=占位符,即可实现在Microsoft Authenticator中和在Google Authenticator中都有效
生成手动输入的密钥
Google Authenticator和Microsoft Authenticator等客户端填入Secret的值腾讯验证器客户端填入完整的URI