安装
npm install bcryptjs
https://www.npmjs.com/package/bcryptjs
以下我列举了一种同步的加密以及验证的方法 (异步方法请参考点击上面的链接去官方文档参考用法)
加密
var bcrypt = require('bcryptjs');
let password = 'bacon'
// 对密码进行10位的加盐 设置为 8 就是 8位加盐
let num = 10
var hash = bcrypt.hashSync(password, num);
验证
let password = 'bacon'
let passwordNew = 'abcon'
// hash 是从数据库取出来的密码
let hash = '$2a$10$VBUcXzdGtDhL8.MCLCw7ZeUJvzWv9IrOrxNCg9ctwYE9lOUb30LUq'
bcrypt.compareSync(password, hash); // true
bcrypt.compareSync(passwordNew, hash); // false
全部代码
const express = require('express');
const mongoose = require('mongoose');
var bcrypt = require('bcryptjs');
const app = express();
// 引入用户模块
const User = require('./models/user');
// 处理post请求
app.use(express.json())
app.use(express.urlencoded({ extended: false }))
//跨域处理
app.use((req, res, next) => {
res.set('Access-Control-Allow-Origin', '*')
res.set('Access-Control-Allow-Headers', 'content-type')
next()
})
// mongoose 连接
mongoose.connect('mongodb://127.0.0.1:27017/v2_demo', {
useNewUrlParser: true,
useUnifiedTopology: true
}).then(() => {
console.log('数据库链接成功')
}).catch(() => {
console.log('数据库链接失败')
})
app.post('/register', async (req, res) => {
// console.log(req.query)
let username = req.body.username
let password = req.body.password
// 先查询有没有这个用户
await User.findOne({username},function(err, doc){
if(err) {
console.log(err.message)
res.send({code: 0, msg: '请稍后再试'}); return
}
console.log(doc)
// 如果有 则注册失败
if(doc) {
let sendData = { data: {}, code: 0, msg: '用户已存在' }
res.send(sendData); return
}
})
// 对用户密码进行加密 然后存储到数据库
password = bcrypt.hashSync(password, 10);
console.log(password)
const newUser = new User({
username,
password
})
// 如果没有 则注册
await newUser.save()
res.send({ code: 1, data: newUser, msg: '注册成功' }); return
})
app.post('/login', async (req, res) => {
let username = req.body.username
let password = req.body.password
// let hash = bcrypt.hashSync(password, 10)
// 先根据用户名 查询有没有这个用户
await User.findOne({username},function(err, doc){
if(err) {
console.log(err.message)
res.send({
code: -1,
msg: '用户名或密码错误'
})
}else{
// 如果有这个用户
if(doc) {
let isOK = bcrypt.compareSync(password, doc.password);
// 再验证密码是否正确
if(isOK) {
let sendData = {
create_time: doc.create_time,
code: 1,
msg: '登录成功',
data: { username: doc.username, id: doc._id, loginTime: new Date().getTime() }
}
res.send(sendData)
return
}
// 密码验证不通过
res.send({
code: -1,
msg: '用户名或密码错误'
})
return false
}
// 没有这个用户
res.send({
code: -1,
msg: '用户名还没有注册'
})
}
})
})
// 可以修改启动的服务端口号
let ports = 3000
// process.env.PORT = ports
app.listen(ports, () => {
console.log( ports +'端口监听成功')
})
user.js
const mongoose = require('mongoose');
// 创建一个表结构
var Schema = mongoose.Schema;
var userSchema = new Schema({
username: { type: String, required: true },
password: { type: String, required: true },
create_time: { type: Number, default: Date.now }
});
// 定义一个索引
// userSchema.index({uid: 1, type: 1})
var User = mongoose.model('user', userSchema);
module.exports = User