具體的詳細代碼github
如今的登錄系統除了第三方登錄接入之外,主要有短信登錄和郵箱登錄,按照如今實名制的特色,如今的短信登錄比較多,可是仍是有一些會用到郵箱登錄的。
本文主要是關於郵箱登錄的相關案例,通俗的說就是用戶使用郵箱註冊,當註冊成功時,會給註冊用戶發郵件進行激活,固然這個郵件有必定的時效性。當用戶激活後能夠正常使用相關的功能,沒激活,當登錄時會提示沒激活,是否須要在發送一條郵件激活。html
- node v8.5.0
- mongodb
- ioredis
- postman
圖中說明了關鍵文件的含義node
當用戶註冊時,首先檢查必要字段是否傳入以及郵箱密碼是否符合規範,而後檢查郵箱是否已註冊,當註冊成功時會發送一個郵件給用戶用來激活這個帳號,這個發送的郵件內容爲一個連接,包含了這個用戶的郵箱以及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
此時的截圖正好把發送郵箱的消息也截取了,完美數據庫
用戶沒有激活時數據庫中這條用戶的status=0;如圖:
數據庫用戶信息
json
經過點擊郵箱中的連接會激活郵箱,當郵箱和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模擬激活成功
當用戶未激活時,登錄會告知未激活,須要去激活,當已激活時信息正常時會成功登錄,當成功登錄時會返回用戶的一些信息以及加一個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);
}複製代碼
未激活登錄時
目前來講只有註冊,激活,登錄接口,後續也能夠實現更多的功能,同時尚未測試,其實也能夠加上測試的。