ExtraVerification: Typecho 后台登录两步验证插件

February 15th, 2016

两步验证又称为双因素验证,是指用户在登录时除了要输入用户名和密码之外,还需要输入一个由手机等设备随机生成的一次性动态密码的登录验证机制,例如 Google Authenticator 就是其中一个常用的动态密码工具。

因为 Typecho 在后台登录没有预留身份认证相关接口,所以要支持两步验证机制不可避免要触动源代码,然而,单靠修改源码添加两步验证支持的话,要变动的文件较多,因此我主张通过插件方式进行验证模块的部署及实现用户自助管理密钥功能。利用这种方法则只需变动 admin/login.phpvar/Widget/User.php 两个文件,可以最大程度简化日后升级后重新添加两步验证的操作。

为了添加两步验证支持,我特意写了一个插件 ExtraVerification ,插件在被启用时会自动在数据库新建储存密钥的字段。该插件现已打包成 ZIP 文件,可到下方下载链接获取。

1. 添加插件

Github 下载地址: ExtraVerification 1.1.0
Github 项目主页: https://github.com/imwis/ExtraVerification

2. 修改源码

代码编辑器打开 admin/login.php 文件,在适当位置插入以下代码:

<p>
    <label for="extAuth" class="sr-only"><?php _e('动态密码'); ?></label>
    <input type="text" id="extAuth" name="extAuth" class="text-l w-100" placeholder="<?php _e('动态密码'); ?>" />
</p>

接着打开 var/Widget/User.php 文件,在 /** 开始验证用户 **/ 相关语句的下方,大约在 126 行的位置,插入以下代码:

if(Typecho_Common::isAvailableClass('ExtraVerification_Plugin')) {
    $extv = new ExtraVerification_Plugin();
    if(false == empty($user['googleAuth']) && 
    false == $extv->googleAuthenticator()->verifyCode($user['googleAuth'], $this->request->extAuth, 1)){
        return false;
    }
}

3. 设置密钥

当插件启用后,从 后台主菜单 -> 设置 -> 两步验证 ,即可进入两步验证设置页面,输入新密钥同时将其添加到 Google Authenticator 中,再输入由新密钥生成的动态密码确认后,即可开启两步验证。

本文共有 2 则回复
    1. Wis Wis

      我是渣渣 orz