scala/java 谷歌认证器的使用

依赖

"com.warrenstrange:googleauth:1.4.0"

在使用到的文件里import
import com.warrenstrange.googleauth.GoogleAuthenticator

使用代码 (scala版本)

1. 生成新的secret key
  • 坑1:原来用的是Random.alphanumeric方法生成sk,虽然位数一样,但不是每次随机生成的sk都能在认证器app中正常使用。——所以还是老老实实用它的api吧
  • 注1:这段代码保证新生成的sk与数据库中的sk不重复(虽然概率极低)
private def generateGoogleAuthSK() = {UserTable.filter(_.gaSk.nonEmpty).map(_.gaSk).result.flatMap(gsSks => {val googleAuth: GoogleAuthenticator = new GoogleAuthenticator()var gaSk = googleAuth.createCredentials.getKeywhile (gsSks.contains(gaSk)) {gaSk = googleAuth.createCredentials.getKey}DBIOAction.successful(gaSk)})}
2. 验证
  • 注1:authorize有两个重载:
    1. public boolean authorize(String secret, int verificationCode)
    2. public boolean authorize(String secret, int verificationCode, long time)
  • 如果使用第一个方法,会自动注入当前时间然后去调用第二个
  • verificationCode就是二次验证码 又名TOTP(Time-based One-time Password),注意它的参数定义是Int,并且实际使用时总是个6位的数字
		val googleAuth: GoogleAuthenticator = new GoogleAuthenticator()if (googleAuth.authorize(req.sk, req.totp)) {//  通过验证   do something after verified...}

其它

返回用户名、秘钥、和生成二维码的相关文本给前端

  • 为了避免多个网站都使用谷歌认证器,用户名混淆,所以在配置里加了个前缀,返回信息时带上前缀
    val username = s"${conf.getString("app.constant.GoogleAuthenticator.usernamePrefix")}${su.user.account}"

  • 三个参数定义分别是case class GaSkResp(qr: String, username: String, sk: String)

  • 最终响应的数据
    GaSkResp(s"otpauth://totp/${username}?secret=${gaSk}", username, gaSk)

前端可以根据以上数据自行生成二维码和组织页面


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部