邮箱注册,激活后才能登录在几年前是非常流行的平台注册模式之一,虽然随着移动端智能化的崛起,很多平台已经可以通过账号关联无需注册就可以登录了,但邮箱注册激活后才能登录的方式依然还有很多平台在使用。
今天分享的是在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服务开启,开启后会有一个秘密,这个秘密就是我们下面程序中发送邮件有的密码】
【所有的输入都是有害的,因此在获取前端表单传送过来的数据时要先过滤。】
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邮箱激活才能登录的教程就分享到这里,有什么不明白的可以评论留言或者可以邮箱邮件留言。