node.js邮箱注册,激活,登陆相关案例
email-verify
具體的詳細代碼github
現(xiàn)在的登陸系統(tǒng)除了第三方登陸接入以外,主要有短信登陸和郵箱登陸,按照現(xiàn)在實名制的特點,現(xiàn)在的短信登陸比較多,但是還是有一些會用到郵箱登陸的。
本文主要是關于郵箱登陸的相關案例,通俗的說就是用戶使用郵箱注冊,當注冊成功時,會給注冊用戶發(fā)郵件進行激活,當然這個郵件有一定的時效性。當用戶激活后可以正常使用相關的功能,沒激活,當?shù)顷憰r會提示沒激活,是否需要在發(fā)送一條郵件激活。
1. 使用工具
- node v8.5.0
- mongodb
- ioredis
- postman
2. 項目結構
項目結構圖圖中說明了關鍵文件的含義
3. 用戶注冊接口
當用戶注冊時,首先檢查必要字段是否傳入以及郵箱密碼是否符合規(guī)范,然后檢查郵箱是否已注冊,當注冊成功時會發(fā)送一個郵件給用戶用來激活這個賬號,這個發(fā)送的郵件內容為一個鏈接,包含了這個用戶的郵箱以及code,code使用reids設置了過期時間。(未激活時用戶狀態(tài)為0,激活狀態(tài)為1)
路由routes中注冊路由如下:
controllers中注冊的部分代碼如下:
try {const user = await findUserAsyc({ 'useremail': user_email });//驗證用戶是否已注冊if (user) {respondData.status = 10002;respondData.error = "郵箱已注冊";return res.json(respondData);}//用戶參數(shù)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 激活郵箱發(fā)送成功";return res.json(respondData);});} catch (error) {//錯誤處理console.log("controllers/UserController.js/user_regist error -->" + JSON.stringify(error));respondData.error = error;return res.json(respondData);}復制代碼郵箱發(fā)送部分代碼
var config_email = {host: 'smtp.163.com',post: 25, // SMTP 端口//secureConnection: true, // 使用 SSLauth: {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', // 發(fā)件地址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模擬注冊
此時的截圖正好把發(fā)送郵箱的消息也截取了,完美
用戶沒有激活時數(shù)據(jù)庫中這條用戶的status=0;如圖:
數(shù)據(jù)庫用戶信息
4. 用戶郵箱激活
通過點擊郵箱中的鏈接會激活郵箱,當郵箱和code不匹配時,會返回郵箱不匹配消息,當code過期時,會返回code過期消息,當用戶已激活時,會告訴已激活,不要重復激活,當用戶信息無上述的幾種情況時會,提示激活成功。
路由routes中激活路由如下:
controllers中注冊的部分代碼如下:
try {let codeVal = await Jtoken(code);if (!codeVal) {respondData.error = "code失效,請重新發(fā)送郵件激活";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模擬激活code失效
postman模擬激活code失效
激活成功時數(shù)據(jù)庫的用戶信息
激活成功時數(shù)據(jù)庫的用戶信息
5. 用戶登陸接口
當用戶未激活時,登陸會告知未激活,需要去激活,當已激活時信息正常時會成功登陸,當成功登陸時會返回用戶的一些信息以及加一個token。
路由routes中登陸路由如下:
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. 后續(xù)
目前來說只有注冊,激活,登陸接口,后續(xù)也可以實現(xiàn)更多的功能,同時還沒有測試,其實也可以加上測試的。
總結
以上是生活随笔為你收集整理的node.js邮箱注册,激活,登陆相关案例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fail2ban安全设置
- 下一篇: 命令行打印文件树列表: tree