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

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

创意 1357 字 / 3 分钟
AI 总结 以下AI总结内容由腾讯混元大模型生成

本文介绍了作者在立方体(Cube)项目中加入谷歌认证器(Google Authenticator)双重验证的过程。作者回顾了自己在高中时编写的一个类似项目,以及在使用阿里云时注意到谷歌认证器的便利性。随后,作者决定将这一功能引入自己的项目中,并对其进行了一些修改和完善。

  1. 灵感来源:作者在高三时脑洞大开,想到了使用六位随机数字进行双重验证的方法,并在实际的 PHP 小工具框架——Cube中实现了这一功能。

  2. 实现过程:作者在 Cube 的登录验证系统中加入了一个 Security 小工具,用于集成 Google Authenticator。他使用了 PHPGangsta/GoogleAuthenticator 这个开源项目来实现双重验证功能。

  3. 代码重构:在改造过程中,作者意识到了在函数中使用全局变量可能带来的问题,并决定在 CubeModel 父类中定义相关变量,以提高代码的可维护性。

  4. 量子纠缠的类比:作者将谷歌认证器的原理与量子力学中的量子纠缠进行了类比,说明了即使服务器和客户端物理上相隔甚远,也能通过共同的时间戳和secret计算出相同的验证码。

  5. 实际效果:最终,作者成功地将 Google Authenticator 集成到了 Cube 中,并修复了一些小问题,提高了项目的完整性。

总的来说,本文展示了一位开发者如何在项目中加入双重验证功能,并从中获得了乐趣和成就感。

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

在高三上学期在宿舍洗澡的时候,我突然脑洞大开,想到了一个生成六位随机数字进行双重验证的东西。 到周末回家的时候花时间写了出来: 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,加点新功能什么的。

谢谢老板 Thanks♪(・ω・)ノ


喜欢这篇文章?为什么不打赏一下呢?