同福

做个用户管理系统(29)——验证绑定邮箱激活码【20201218】

介绍

介绍

福哥今天带着大家完成绑定邮箱功能的后一部分——验证绑定邮箱激活码功能。这个激活码的验证需要几个步骤:1)根据激活码使用AES算法解密得到原始数据;2)判断激活码内的用户状态是否正常;3)判断激活码内的邮箱地址是否被占用;4)写入绑定邮箱数据。

解密激活码比较简单,不过要考虑一个时间差的问题,因为激活码的时间戳精确到1个小时,而生成激活码有可能在59分操作的,那么当收到邮件时候已经是下一个小时了。为了解决这个问题,我们需要先检验当前这个小时和上一个小时,两个之中一定会有一个成功的。

判断激活码的用户状态和判断激活码的邮箱地址都比较简单,在生成激活码时候就已经处理过了。为什么要在这里又操作一次呢?这是为了以防万一啊!如果此时用户被删除了呢?如果此时邮箱地址被其他人抢先绑定了呢?

写入绑定邮箱数据,写入后就算完成了绑定操作了。

模型user

bindEmail

public function bindEmail(string $dataEncrypted):bool {
    $tfdo = $this->tfphp->getDatabase()->getTFDO();
    $myAES = new TFAES($this->tfphp);

    $timestamp = date("YmdH0000");
    $data = $myAES->decrypt($dataEncrypted, TFConfig::get("projectAESPK", "system"). $timestamp, "");
    $arr = unserialize($data);
    if(!is_array($arr)
        || $arr['id'] == 0
        || $arr['email'] == ""){
        $timestamp = date("YmdH0000", strtotime("-1 hour"));
        $data = $myAES->decrypt($dataEncrypted, TFConfig::get("projectAESPK", "system"). $timestamp, "");
        $arr = unserialize($data);
        if(!is_array($arr)
            || $arr['id'] == 0
            || $arr['email'] == ""){

            return 1;
        }
    }

    $userID = $arr['id'];
    $email = $arr['email'];

    $userInfo = $this->getByTable("user", array($userID));
    if($userInfo == null){

        return 2;
    }

    $userInfo = $this->getByTable("userByEmail", array($email));
    if($userInfo != null
        && $userInfo['userID'] != $userID){

        return 3;
    }

    $ret = $tfdo->update("user", array(
        'userEmail'=>$email
    ), null, "userID = @int", array(
        $userID
    ));
    if(!$ret){

        return 4;
    }

    return 0;
}

接口控制器

doVerify

private function doVerify(){
    $req = $this->tfphp->getRequest();
    $post = $req->post;
    $user = new user($this->tfphp);
    $data = $req->get->get("data");

    try{
        // request test
        if($data == ""){

            return $this->tfphp->getResponse()->responseJSON_CM(200, 1001071, "错误请求");
        }

        // create user
        $ret = $user->bindEmail($data);
        switch ($ret){
            case 1:
                return $this->tfphp->getResponse()->responseJSON_CM(200, 1001072, "激活码无效");
                break;
            case 2:
                return $this->tfphp->getResponse()->responseJSON_CM(200, 1001073, "用户名不存在");
                break;
            case 3:
                return $this->tfphp->getResponse()->responseJSON_CM(200, 1001074, "邮箱地址已经存在");
                break;
            case 4:
                return $this->tfphp->getResponse()->responseJSON_CM(200, 1001075, "绑定邮箱失败");
                break;
        }
    }
    catch(\TypeError $e){

        return $this->tfphp->getResponse()->responseJSON_CM(200, 1001071, "错误请求");
    }

    // output
    return $this->tfphp->getResponse()->responseJSON_CM(200, 0, "OK");
}

讲解

因为验证绑定邮箱激活码不需要操作表单,这里就没有视图和JS的事情了。我们只是在页面里通过AJAX请求验证激活码接口进行激活处理就行了。

模型user

bindEmail

首先使用当前小时和上一小时两个时间进行激活码解密处理。

接着判断用户状态是否正常。

然后判断邮箱地址是否被占用。

最后将邮箱地址写入用户数据表。

接口控制器

doVerify

这里面调用模型user的bindEmail方法进行绑定邮箱激活码的判断。

效果

这是绑定成功的界面内容,很简单就不过多介绍了。

6198bed3ac69e877.jpg

总结

今天福哥带着童鞋们完成了绑定邮箱表单的后一部分——验证绑定邮箱激活码的功能。这下绑定邮箱表单功能就算完全地做好了。绑定邮箱表单属于多步骤且异步的复杂功能,大家有可能会感觉有点晕。没关系,做的多了,就会慢慢习惯了!

下一课我们将开发安全问题表单的功能,敬请期待~~