摘要:本文主要是關于郵箱登陸的相關案例,通俗的說就是用戶使用郵箱注冊,當注冊成功時,會給注冊用戶發(fā)郵件進行激活,當然這個郵件有一定的時效性。當用戶激活后可以正常使用相關的功能,沒激活,當?shù)顷憰r會提示沒激活,是否需要在發(fā)送一條郵件激活。
email-verify
具體的詳細代碼github
現(xiàn)在的登陸系統(tǒng)除了第三方登陸接入以外,主要有短信登陸和郵箱登陸,按照現(xiàn)在實名制的特點,現(xiàn)在的短信登陸比較多,但是還是有一些會用到郵箱登陸的。
本文主要是關于郵箱登陸的相關案例,通俗的說就是用戶使用郵箱注冊,當注冊成功時,會給注冊用戶發(fā)郵件進行激活,當然這個郵件有一定的時效性。當用戶激活后可以正常使用相關的功能,沒激活,當?shù)顷憰r會提示沒激活,是否需要在發(fā)送一條郵件激活。
2. 項目結(jié)構(gòu)node v8.5.0
mongodb
ioredis
postman
圖中說明了關鍵文件的含義
3. 用戶注冊接口當用戶注冊時,首先檢查必要字段是否傳入以及郵箱密碼是否符合規(guī)范,然后檢查郵箱是否已注冊,當注冊成功時會發(fā)送一個郵件給用戶用來激活這個賬號,這個發(fā)送的郵件內(nèi)容為一個鏈接,包含了這個用戶的郵箱以及code,code使用reids設置了過期時間。(未激活時用戶狀態(tài)為0,激活狀態(tài)為1)
路由routes中注冊路由如下:
//user_regist router.post("/user_regist", userCtrl.user_regist);
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, // 使用 SSL auth: { user: "[email protected]", //這里密碼不是qq密碼,是你設置的smtp密碼 pass: "wwf" } }; var transporter = nodemailer.createTransport(config_email); var html = "http://127.0.0.1:3000?code=" + code + "&account=" + cnd + ""; console.log(html); var data = { from: "[email protected]", // 發(fā)件地址 to: cnd, // 收件列表 subject: "Hello feng", // 標題 //text: html // 標題 //text和html兩者只支持一種 html: html // html 內(nèi)容 }; 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ù)庫用戶信息
通過點擊郵箱中的鏈接會激活郵箱,當郵箱和code不匹配時,會返回郵箱不匹配消息,當code過期時,會返回code過期消息,當用戶已激活時,會告訴已激活,不要重復激活,當用戶信息無上述的幾種情況時會,提示激活成功。
路由routes中激活路由如下:
//user_activation router.get("/user_activation", userCtrl.user_activation);
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 = "此郵箱已經(jīng)激活了哦,不要重復激活"; 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失效
激活成功時數(shù)據(jù)庫的用戶信息
當用戶未激活時,登陸會告知未激活,需要去激活,當已激活時信息正常時會成功登陸,當成功登陸時會返回用戶的一些信息以及加一個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); }
未激活登陸時
已激活登陸時
目前來說只有注冊,激活,登陸接口,后續(xù)也可以實現(xiàn)更多的功能,同時還沒有測試,其實也可以加上測試的。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/19131.html
摘要:在路由回調(diào)函數(shù)里面操作的時候,直接用就可以獲取到客戶端的值。用回調(diào)函數(shù)來寫后期看起來會很吃力看有沒有重名的看是不是同一郵箱又想重復注冊如果是以上兩種情況,就發(fā)送錯誤信息。此賬戶名已經(jīng)被注冊。 1. 開場白 用戶系統(tǒng)是許多網(wǎng)站的基礎。這篇文章主要就是講解如何寫一個基于Node的單頁應用的用戶系統(tǒng),這個用戶系統(tǒng)的功能包括:注冊,登錄,自動登錄,忘記密碼,修改密碼,郵件激活。如果使用在后端使...
摘要:目前該功能并未完善,敬請期待。反正每次都會有新的東西補充上去一開始我本來想做的是可以使用微信登陸,也可以使用賬戶郵箱登陸,也可以使用短信登陸的。后來發(fā)現(xiàn)微信登陸要企業(yè)認證,做不了。 從零開發(fā)項目概述 最近這一直在復習數(shù)據(jù)結(jié)構(gòu)和算法,也就是前面發(fā)出去的排序算法八大基礎排序總結(jié),Java實現(xiàn)單向鏈表,棧和隊列就是這么簡單,十道簡單算法題等等... 被虐得不要不要的,即使是非常簡單有時候繞半...
閱讀 783·2021-11-23 09:51
閱讀 848·2021-11-23 09:51
閱讀 2517·2021-11-15 18:01
閱讀 3876·2021-10-11 11:07
閱讀 2415·2021-09-22 15:30
閱讀 1084·2021-09-22 14:59
閱讀 1567·2019-08-30 15:55
閱讀 1763·2019-08-30 15:52