我在 Cube 中加入了 Google Authenticator 登录验证

我在 Cube 中加入了 Google Authenticator 登录验证

创意 1357 字 / 3 分钟

真是巧合,我居然又是造轮子

在高三上学期在宿舍洗澡的时候,我突然脑洞大开,想到了一个生成六位随机数字进行双重验证的东西。 到周末回家的时候花时间写了出来: OneCode https://github.com/wuhan005/OneCode 你也可以看看我当时介绍她时所写的文章。 当时还给她设计了个 Logo 来着,回想起来不禁觉得自己当时脑洞也真是挺大的。 但脑洞归脑洞,这个应用也像我的一大堆坑一样,最终没有被实际用起来,堆在 GitHub 里了。

而在之前杭电助手的一次例会上,部长在登录阿里云时所使用的一款手机 App,引起了我的注意。 这是一款 Google 的 App —— Google Authenticator。 页面十分简单,进去后就是几个六位数的数字验证码。在输入阿里云账号密码登录后,还需输入这个 App 里的数字验证码进行二次登录验证。 之后我还了解到,在助手的 Gitea 上,也是可以用这个 App 来进行登录的。

这不就像是我多年前写的 OneCode 吗?原来自己又在造轮子了。

回到宿舍后,我也下了个 Google Authenticator 并将其使用在了我阿里云的双重验证上。 还真别说,登录时拿出手机打开 App 看验证码还真挺帅的。(我脑子可能有病 话说,这么帅的登录方式,阿里云可以用,Gita 可以用,那我是不是也可以拿来用?说干就干!!

Cube 就决定是你了

要说我有哪些项目可以加上这个双重验证的? 我首先就想到了之前写的,并且已经实际投入使用的 PHP 小工具框架 —— Cube。

我决定在 Cube 的登录验证中加一种可以使用 Google Authenticator 登录。 这样我每次就只需要优雅地拿出手机,瞟一眼验证码,优雅地输入,一气呵成,帅!!怕不是个智障 那么,就开始改吧,反正 Cube 也好久没更新了。

年少时的任性,有些代码伤人不轻

再一次打开 Cube 这个项目,在系统的小工具里加入一个Security小工具,相关的页面啊,路由啊写好。这时我才感觉自己当时写这个框架时,很多地方考虑地并不是很周全。我应该尽量避免在函数中使用全局变量来实现外部变量在函数内的访问,取而代之的是写在CubeModel父类中,因为 Cube 中的每个小工具都是继承于这个父类。 唔……总而言之,改起来有些心塞吧。有时间一定好好重构一番。

我这里是使用 GitHub 上的一个开源项目:PHPGangsta/GoogleAuthenticator 确实写得挺好的,直接拿来用就好。 通过粗略阅读其源码,我们可以大致了解到 Google Authenticator 的原理。 每次创建一个新的 GA 时,其实就是生成了一段随机字符串secret,而验证输入的六位数字,是通过当前时间戳结合secret计算出来的。 因此只要客户端上保存了这段secret,只要服务器和客户端的时间戳相同(或在设定的可接受的相差范围内),就能计算出一样的六位验证码。 这样,即使客户端没有联网且无法与服务器通信,都不妨碍验证。因为,二者的时间戳,是相同的。

这,量子纠缠?

写到这,我突然想到了量子力学中的一个概念——量子纠缠。也不知道理解对不对哈。在这里,服务器和客户端,不管在物理的空间上离得有多远,不管二者之间是否能够通信,都可以通过约定好的secret以及共同的时间戳计算出相同的验证码。“时间戳”这个时间上的概念,对于服务器和客户端而言,是不受物理位置的影响的。这些东西,往深了想,感觉还真挺厉害的。

效果还不错

最后的成果~ 还是不错的!通过手机上的 App 登录倒是挺方便的。因为之前在服务器上给 PHP 配置好了部署。因此上线十分的方便。同时我也修了几个 Cube 的小问题。以后有空也可以修修 Cube,加点新功能什么的。