本文作者:心月

php 账号注册 QQ邮箱激活才能登录教程分享

心月IT博客 2019-04-22
php 账号注册 QQ邮箱激活才能登录教程分享摘要:邮箱注册,激活后才能登录在几年前是非常流行的平台注册模式之一,虽然随着移动端智能化的崛起,很多平台已经可以通过账号关联无需注册就可以登录了,但邮箱注册激活后才能登录的方式依然还有很多平台在使用。

    邮箱注册,激活后才能登录在几年前是非常流行的平台注册模式之一,虽然随着移动端智能化的崛起,很多平台已经可以通过账号关联无需注册就可以登录了,但邮箱注册激活后才能登录的方式依然还有很多平台在使用。

    今天分享的是在php中如何实现账号注册,邮箱激活登录。本次教程php实现邮件发送功能主要使用的 swiftmailer-master 类库。

<?php
require_once '../function/autoload.php';
require_once '../function/PdoMysql.class.php';  //pdo数据库操作类
require_once 'config.php'; //数据库配置信息
require_once '../function/swiftmailer/swiftmailer/lib/swift_required.php';//邮件发送类库
require_once 'pwd.php'; //QQ邮箱smtp密码(不是QQ邮箱密码)
require_once '../function/JwtAuth.php'; //JWT token生成类

$act = $_GET['act'];
$pdoDb = new PdoMysql();

switch ($act){
    case 'reg':
        //注册
        
        break;
    case 'login':
        //登录
        
        break;
    case 'active':
        //激活
        
        break;
    default:break;
}

平台注册的三大功能:注册-激活-登录。

前台的注册-登录-激活表单这里就不说了,无非就是通过 form 表单给后端传送数据。

1、注册:

这里我把注册分为了三块

①把用户名、密码、邮箱、账号注册时间写入用户表。

②通过用户账号id生成Token,并写入对应用户数据表。

【不知道Token怎么生成的,可以看 php开发app接口之Token的生成实现 这篇文章,里面详细的介绍了利用 JWT 生成 token 的步骤】

③发送邮件通知用户激活账号。

【发送邮件需要注意的事项:QQ邮箱需要把 POP3/SMTP服务 IMAP/SMTP服务开启,开启后会有一个秘密,这个秘密就是我们下面程序中发送邮件有的密码】

【所有的输入都是有害的,因此在获取前端表单传送过来的数据时要先过滤。】

QQ邮箱设置

case 'reg':
        //注册
        //①数据表中写入基础数据
        $user_name = addslashes($_POST['username']);
        //密码加密
        $password = _md5(addslashes($_POST['password']));
        $email = addslashes($_POST['email']);
        $created_at = time();
        $data = compact('user_name', 'password', 'email', 'created_at');
        $res = $pdoDb->add($data,'user');
        if ($res){
            //②获取用户id,生成token
            $uid = $pdoDb->getLastInsertId();
            $jwtAuth = JwtAuth::getInstance();
            $token = $jwtAuth->setUid($uid)->encode()->getToken();
            $token_exptime = time()+3600*24;
            $dataUpdate = compact('token', 'token_exptime');
            $resUpdate = $pdoDb->update($dataUpdate, 'user', 'user_id='.$uid);

            //③发送激活邮件
            //配置邮件服务器,得到传输对象
            $transport=Swift_SmtpTransport::newInstance('smtp.qq.com',465,'ssl');
            //设置登陆帐号和密码
            $transport->setUsername('739120308@qq.com');
            $transport->setPassword($emailPassword);
            //得到发送邮件对象Swift_Mailer对象
            $mailer=Swift_Mailer::newInstance($transport);
            //得到邮件信息对象
            $message=Swift_Message::newInstance();
            //设置管理员的信息
            $message->setFrom(array('739120308@qq.com'=>'BY'));
            //将邮件发给谁
            $message->setTo(array($email=>'BY'));
            //设置邮件主题
            $message->setSubject('激活邮件');
            $url="http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']."?act=active&token={$token}";
            $urlencode=urlencode($url);
            $str=<<<EOF
      亲爱的{$user_name}您好~!感谢您注册我们网站<br/>
      请点击此链接激活帐号即可登陆!<br/>
      <a href="{$url}">{$urlencode}</a>
      <br/>
      如果点此链接无反映,可以将其复制到浏览器中来执行,链接的有效时间为24小时。    
EOF;
            $message->setBody("{$str}",'text/html','utf-8');
            try{
                if($mailer->send($message)){
                    echo "恭喜您{$user_name}注册成功,请到邮箱激活之后登陆<br/>";
                    echo '3秒钟后跳转到登陆页面';
                    echo '<meta http-equiv="refresh" content="3;url=index.php#tologin"/>';
                }else{
                    $pdoDb->delete($table,'id='.$uid);
                    echo '注册失败,请重新注册';
                    echo '3秒钟后跳转到注册页面';
                    echo '<meta http-equiv="refresh" content="3;url=index.php#toregister"/>';
                }
            }catch(Swift_ConnectionException $e){
                echo '邮件发送错误'.$e->getMessage();
            }
        }
        break;


2、激活

    账号激活注意通过验证 token 的有效性以及是否过期来激活。token 的验证可以参考这里文章 app接口开发之Token的发放与验证

    token 验证通过后需要把账号的状态改为激活状态,因为 token 是根据用户 id 生成的,因此这里可以直接用token作为条件来修改账号状态,减少了数据库的二次操作。

账号激活失败的两种处理方式:

    ①把激活失败的用户其信息从数据表中删除,让他重新注册激活。

    ②提供一个激活入口,让用户提供注册邮箱或者用户名,然后重新发送激活邮箱。

case 'active':
    //激活
    $token = $_GET['token'];
    //token验证
    $jwtAuth = JwtAuth::getInstance();
    $jwtAuth = $jwtAuth->setToken($token);
    if ($jwtAuth->validate() && $jwtAuth->verify()){
        $status = 1;
        $dataUpdate = compact('status');
        //token是唯一的,可以直接用token作为条件来修改状态
        $activeRes = $pdoDb->update($dataUpdate,'user', 'token="'.$token. '" AND status="0"');

        if ($activeRes){
            echo '激活成功';
            echo '<meta http-equiv="refresh" content="3;url=index.php#tologin"/>';
        }else{
            echo '激活失败,请重新激活';
            echo '<meta http-equiv="refresh" content="3;url=index.php#toactive"/>';
        }

    }else{
        echo 'token过期,请重新激活';
        echo '<meta http-equiv="refresh" content="3;url=index.php#toactive"/>';
    }
    break;


3、登陆

登陆有两步验证:

    用户名、密码验证;

    激活状态验证。

case 'login':
    //登录
    $user_name = addslashes($_POST['username']);
    //密码加密,可自定义加密方法,也可以用php自带的加密方法,这里使用的是自定义加密方法
    $password = _md5(addslashes($_POST['password']));
    $res = $pdoDb->find('user', 'username='.$user_name,'user_id,password,status');
    if ($password == $res['password']){
        if ($res['status']==1){
            echo '登录成功';
        }else{
            echo '请先激活再登录';
            echo '<meta http-equiv="refresh" content="3;url=index.php#toactive"/>';
        }
    }else{
        echo '用户名或密码错误,请重新登录';
        echo '<meta http-equiv="refresh" content="3;url=index.php#tologin"/>';
    }
    break;

    php 账号注册 QQ邮箱激活才能登录的教程就分享到这里,有什么不明白的可以评论留言或者可以邮箱邮件留言。

文章版权及转载声明:

本文由 心月IT技术博客 博主整理于 2019-04-22
若转载请注明原文及出处:https://www.xinyueseo.com/other/249.html

分享到:
赞(
发表评论
快捷输入:

验证码

    评论列表 (有 0 条评论,人围观)参与讨论