本文作者:心月

php 賬號注冊 QQ郵箱激活才能登錄教程分享

心月IT博客 2019-04-22
摘要:郵箱注冊,激活后才能登錄在幾年前是非常流行的平臺注冊模式之一,雖然隨著移動端智能化的崛起,很多平臺已經可以通過賬號關聯無需注冊就可以登錄了,但郵箱注冊激活后才能登錄的方式依然還有很多平臺在使用。

    郵箱注冊,激活后才能登錄在幾年前是非常流行的平臺注冊模式之一,雖然隨著移動端智能化的崛起,很多平臺已經可以通過賬號關聯無需注冊就可以登錄了,但郵箱注冊激活后才能登錄的方式依然還有很多平臺在使用。

    今天分享的是在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('[email protected]');
            $transport->setPassword($emailPassword);
            //得到發送郵件對象Swift_Mailer對象
            $mailer=Swift_Mailer::newInstance($transport);
            //得到郵件信息對象
            $message=Swift_Message::newInstance();
            //設置管理員的信息
            $message->setFrom(array('[email protected]'=>'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郵箱激活才能登錄的教程就分享到這里,有什么不明白的可以評論留言或者可以郵箱郵件留言。

文章版權及轉載聲明:

作者:心月 本文地址:http://www.rawkpk.live/other/249.html發布于 2019-08-29
文章轉載或復制請以超鏈接形式并注明出處心月IT博客

分享到:
贊(

發表評論

快捷輸入:

    評論列表 (有 0 條評論,人圍觀)參與討論