node.js郵箱註冊,激活,登錄相關案例

email-verify

具體的詳細代碼github
如今的登錄系統除了第三方登錄接入之外,主要有短信登錄和郵箱登錄,按照如今實名制的特色,如今的短信登錄比較多,可是仍是有一些會用到郵箱登錄的。
本文主要是關於郵箱登錄的相關案例,通俗的說就是用戶使用郵箱註冊,當註冊成功時,會給註冊用戶發郵件進行激活,固然這個郵件有必定的時效性。當用戶激活後能夠正常使用相關的功能,沒激活,當登錄時會提示沒激活,是否須要在發送一條郵件激活。html

1. 使用工具

  • node v8.5.0
  • mongodb
  • ioredis
  • postman

2. 項目結構

項目結構圖
項目結構圖

圖中說明了關鍵文件的含義node

3. 用戶註冊接口

當用戶註冊時,首先檢查必要字段是否傳入以及郵箱密碼是否符合規範,而後檢查郵箱是否已註冊,當註冊成功時會發送一個郵件給用戶用來激活這個帳號,這個發送的郵件內容爲一個連接,包含了這個用戶的郵箱以及code,code使用reids設置了過時時間。(未激活時用戶狀態爲0,激活狀態爲1)
路由routes中註冊路由以下:git

//user_regist
router.post('/user_regist', userCtrl.user_regist);複製代碼

controllers中註冊的部分代碼以下:github

try {
        const user = await findUserAsyc({ 'useremail': user_email });//驗證用戶是否已註冊
        if (user) {
            respondData.status = 10002;
            respondData.error = "郵箱已註冊";
            return res.json(respondData);
        }
        //用戶參數
        const userpassword = md5(user_password);
        const userInfo = {
            useremail: user_email,
            username: user_name,
            userpwd: userpassword,
            status: 0,
            create_time: Date.now('YYYY-MM-DD')
        };
        //新建用戶
        console.log("newGuess.save userInfo-->" + JSON.stringify(userInfo));
        const newUser = new UserModel(userInfo);
        newUser.save(function (err, data) {
            if (err) {
                console.log("newGuess.save err-->" + JSON.stringify(err));
                respondData.status = "00001";
                respondData.error = "mongodb system error";
                return res.json(respondData);
            }
            console.log("newGuess.save data -->" + JSON.stringify(data));
            let userEmail = data.useremail;
            let sendEmail = sendUserEmail(userEmail);
            console.log("sendEmail:" + sendEmail);
            respondData.msg = "新用戶註冊成功 and 激活郵箱發送成功";
            return res.json(respondData);
        });
    } catch (error) {
        //錯誤處理
        console.log("controllers/UserController.js/user_regist error -->" + JSON.stringify(error));
        respondData.error = error;
        return res.json(respondData);
    }複製代碼

郵箱發送部分代碼redis

var config_email = {
        host: 'smtp.163.com',
        post: 25, // SMTP 端口
        //secureConnection: true, // 使用 SSL
        auth: {
            user: 'wangweifengyx@163.com',
            //這裏密碼不是qq密碼,是你設置的smtp密碼
            pass: 'wwf'
        }
    };
    var transporter = nodemailer.createTransport(config_email);

    var html = "<div>http://127.0.0.1:3000?code=" + code + "&account=" + cnd + "</div>";
    console.log(html);
    var data = {
        from: 'wangweifengyx@163.com', // 發件地址
        to: cnd, // 收件列表
        subject: 'Hello feng', // 標題

        //text: html // 標題 //text和html二者只支持一種
        html: html // html 內容
    };
    console.log(data);
    transporter.sendMail(data, function (err, info) {
        if (err) {
            return (err);
        }
        console.log(info.response);
        return (info.response);

    });複製代碼

使用postman模擬註冊
mongodb

postman模擬註冊
postman模擬註冊

此時的截圖正好把發送郵箱的消息也截取了,完美數據庫

用戶沒有激活時數據庫中這條用戶的status=0;如圖:
數據庫用戶信息
json

數據庫用戶信息
數據庫用戶信息

4. 用戶郵箱激活

經過點擊郵箱中的連接會激活郵箱,當郵箱和code不匹配時,會返回郵箱不匹配消息,當code過時時,會返回code過時消息,當用戶已激活時,會告訴已激活,不要重複激活,當用戶信息無上述的幾種狀況時會,提示激活成功。
路由routes中激活路由以下:dom

//user_activation
router.get('/user_activation', userCtrl.user_activation);複製代碼

controllers中註冊的部分代碼以下:工具

try {
        let codeVal = await Jtoken(code);
        if (!codeVal) {
            respondData.error = "code失效,請從新發送郵件激活";
            return res.json(respondData);
        }
        let userinfo = JSON.parse(codeVal);
        if (userinfo.userEmail !== user_email) {
            respondData.error = "郵箱不正確";
            return res.json(respondData);
        }
        const user = await findUserAsyc({ 'useremail': user_email });//驗證用戶是否已註冊
        if (user) {
            if (user.status === 0) {
                UserModel.update({ 'useremail': user_email }, { '$set': { status: 1 } }, function (err, results) {
                    if (err) {
                        console.log("UserModel.update err-->" + JSON.stringify(err));
                        respondData.status = "00001";
                        respondData.error = "mongodb system error";
                        return res.json(respondData);
                    }
                    respondData.msg = "郵箱激活成功";
                    return res.json(respondData);
                })
            } else if (user.status === 1) {
                respondData.msg = "此郵箱已經激活了哦,不要重複激活";
                return res.json(respondData);
            }
        }
    } catch (error) {
        //錯誤處理
        console.log("controllers/UserController.js/user_regist error -->" + JSON.stringify(error));
        respondData.error = error;
        return res.json(respondData);
    }複製代碼

使用postman模擬激活成功

postman模擬激活成功
postman模擬激活成功

使用postman模擬激活code失效
postman模擬激活code失效
postman模擬激活code失效

激活成功時數據庫的用戶信息
激活成功時數據庫的用戶信息
激活成功時數據庫的用戶信息

5. 用戶登錄接口

當用戶未激活時,登錄會告知未激活,須要去激活,當已激活時信息正常時會成功登錄,當成功登錄時會返回用戶的一些信息以及加一個token。
路由routes中登錄路由以下:

//user_login
router.post('/user_login', userCtrl.user_login);複製代碼

controllers中登錄的部分代碼以下:

try {
        const user = await findUserAsyc({ 'useremail': user_email });//驗證用戶是否已註冊
        if (!user) {
            respondData.status = 10000;
            respondData.error = "郵箱未註冊";
            return res.json(respondData);
        }
        const userverify = await findUserVerify(user_email,user_password);//驗證用戶
        if(!userverify){
            respondData.status = 10005;
            respondData.error = "郵箱或密碼錯誤";
            return res.json(respondData);
        }
        console.log(userverify);
        if(userverify.status === 0){
            respondData.status = 10006;
            respondData.error = "郵箱未激活,請激活郵箱";
            return res.json(respondData);
        } else if(userverify.status === 1){
            const tokenexpiraton = 1800;
            const token = require('crypto').randomBytes(16).toString('hex');
            const tokenContent = {
                useremail: userverify.useremail,
                username: userverify.username
            };
            redis.set(token, JSON.stringify(tokenContent));
            redis.expire(token, tokenexpiraton);
            const userBackInfo = {};
            userBackInfo.token = token;
            userBackInfo.useremail = userverify.useremail;
            userBackInfo.username = userverify.username;
            userBackInfo._id = userverify._id;
            respondData.data.push(userBackInfo);
            respondData.msg = "登錄成功";
            return res.json(respondData);
        }    
    } catch (error) {
        //錯誤處理
        console.log("controllers/UserController.js/user_regist error -->" + JSON.stringify(error));
        respondData.error = error;
        return res.json(respondDaata);
    }複製代碼

未激活登錄時

未激活登錄時
未激活登錄時

已激活登錄時
已激活登錄時
已激活登錄時

6. 後續

目前來講只有註冊,激活,登錄接口,後續也能夠實現更多的功能,同時尚未測試,其實也能夠加上測試的。

相關文章
相關標籤/搜索