Node+Express+Mongodb实现登录注册
思路:当用户登录的时候去判断数据库中是否有该用户名,如果有,验证用户输入的密码和数据库中存储的是否一致;如果没有,则提醒用户该账号不存在,应该去注册;注册的时候,将密码进行加密(用户的账号和密码要确保其安全性),可用bcrypt进行加密(它的原理输入的明文密码通过10次循环加盐后得到myHash(版本+salt),然后存入数据库。系统在验证用户时,需要从myHash中取出salt跟password进行hash;得到的结果保存在数据库中的hash进行比对,如果一致才算验证通过);登录的时候将生成的token传给前端,在需要的地方验证token。 (1)安装bcrypt进行加密,解密 npm install bcrypt --save (2)安装jsonwebtoken,生成和验证token npm install jsonwebtoken (3)使用 bcrypt.hashSync(password, 10) 对密码进行加密 (4)使用 bcrypt.compareSync(password, data.password) 验证密码的正确性 (5)使用 jwt.sign(data, ‘wx’, { expiresIn: 10 1 })* 生成token (6)使用 jwt.verify(验证的token,自定义密钥,回调) 验证token
写登录注册的模块login.js
const express = require('express')
const router = express.Router()
const bcrypt = require('bcrypt')
const jwt = require('jsonwebtoken')
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/loveHome')
let db = mongoose.connection
let loginCollection = db.collection('login')
router.post('/register', (req, res) => {
const { username, password, accountNumber } = req.body
if (accountNumber && password) {
const hashPwd = bcrypt.hashSync(password, 10)
let obj = { username, password: hashPwd, accountNumber }
loginCollection.insertOne(obj, (err, result) => {
if (result) {
res.send({
msg: '注册成功'
})
} else {
res.send({
msg: '注册失败'
})
}
})
} else {
res.send({
code: '111111',
msg: '参数错误'
})
}
})
router.post('/login', (req, res) => {
const { password, accountNumber } = req.body
if (accountNumber && password) {
loginCollection.findOne({ accountNumber }, (err, data) => {
if (data) {
const isPwdValid = bcrypt.compareSync(password, data.password)
if (isPwdValid) {
let token = jwt.sign(data, 'wx', { expiresIn: 10* 1 });
res.send({
msg: '登录成功',
token: token,
success:true,
data:data
})
} else {
res.send({
msg: '密码错误',
success:false,
})
}
}else{
res.send({
msg: '该用户不存在,请注册',
success:false,
})
}
})
} else {
res.send({
success:false,
msg: '参数错误'
})
}
})
module.exports = router
app.js
var express = require('express');
var path = require('path');
const loginRouter = require('./routes/login/login')
const pictureRouter = require('./routes/pictureMsg')
const {jwtCheck} = require('./routes/login/jwt')
var app = express();
app.all('*', function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "*");
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
res.header("X-Powered-By", ' 3.2.1')
res.header("Content-Type", "application/json;charset=utf-8");
next();
});
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use('/',loginRouter)
app.use(jwtCheck)
app.use(pictureRouter)
app.listen('3001', 'localhost', () => {
console.log("启动成功")
})
module.exports = app;
jwt.js文件
const jwt = require('jsonwebtoken')
const jwtKey = 'wx'
const jwtSign = (data) => {
const token = jwt.sign(data, jwtKey, {expiresIn: 10 * 1})
return token
}
const jwtCheck = (req, res, next) => {
const token = req.headers.token
jwt.verify(token, jwtKey, (err, data) => {
if (err) {
res.send({
code: '1111',
msg: 'token无效'
})
} else {
req.jwtInfo = data
next()
}
})
}
module.exports = {
jwtSign,
jwtCheck
}
个人练习,如果有不对的地方,或者我理解错的地方,希望各位可以指正,谢谢。
|