安装

npm install bcryptjs
https://www.npmjs.com/package/bcryptjs
以下我列举了一种同步的加密以及验证的方法 (异步方法请参考点击上面的链接去官方文档参考用法)

加密

  1. var bcrypt = require('bcryptjs');
  2. let password = 'bacon'
  3. // 对密码进行10位的加盐 设置为 8 就是 8位加盐
  4. let num = 10
  5. var hash = bcrypt.hashSync(password, num);

验证

  1. let password = 'bacon'
  2. let passwordNew = 'abcon'
  3. // hash 是从数据库取出来的密码
  4. let hash = '$2a$10$VBUcXzdGtDhL8.MCLCw7ZeUJvzWv9IrOrxNCg9ctwYE9lOUb30LUq'
  5. bcrypt.compareSync(password, hash); // true
  6. bcrypt.compareSync(passwordNew, hash); // false

全部代码

  1. const express = require('express');
  2. const mongoose = require('mongoose');
  3. var bcrypt = require('bcryptjs');
  4. const app = express();
  5. // 引入用户模块
  6. const User = require('./models/user');
  7. // 处理post请求
  8. app.use(express.json())
  9. app.use(express.urlencoded({ extended: false }))
  10. //跨域处理
  11. app.use((req, res, next) => {
  12. res.set('Access-Control-Allow-Origin', '*')
  13. res.set('Access-Control-Allow-Headers', 'content-type')
  14. next()
  15. })
  16. // mongoose 连接
  17. mongoose.connect('mongodb://127.0.0.1:27017/v2_demo', {
  18. useNewUrlParser: true,
  19. useUnifiedTopology: true
  20. }).then(() => {
  21. console.log('数据库链接成功')
  22. }).catch(() => {
  23. console.log('数据库链接失败')
  24. })
  25. app.post('/register', async (req, res) => {
  26. // console.log(req.query)
  27. let username = req.body.username
  28. let password = req.body.password
  29. // 先查询有没有这个用户
  30. await User.findOne({username},function(err, doc){
  31. if(err) {
  32. console.log(err.message)
  33. res.send({code: 0, msg: '请稍后再试'}); return
  34. }
  35. console.log(doc)
  36. // 如果有 则注册失败
  37. if(doc) {
  38. let sendData = { data: {}, code: 0, msg: '用户已存在' }
  39. res.send(sendData); return
  40. }
  41. })
  42. // 对用户密码进行加密 然后存储到数据库
  43. password = bcrypt.hashSync(password, 10);
  44. console.log(password)
  45. const newUser = new User({
  46. username,
  47. password
  48. })
  49. // 如果没有 则注册
  50. await newUser.save()
  51. res.send({ code: 1, data: newUser, msg: '注册成功' }); return
  52. })
  53. app.post('/login', async (req, res) => {
  54. let username = req.body.username
  55. let password = req.body.password
  56. // let hash = bcrypt.hashSync(password, 10)
  57. // 先根据用户名 查询有没有这个用户
  58. await User.findOne({username},function(err, doc){
  59. if(err) {
  60. console.log(err.message)
  61. res.send({
  62. code: -1,
  63. msg: '用户名或密码错误'
  64. })
  65. }else{
  66. // 如果有这个用户
  67. if(doc) {
  68. let isOK = bcrypt.compareSync(password, doc.password);
  69. // 再验证密码是否正确
  70. if(isOK) {
  71. let sendData = {
  72. create_time: doc.create_time,
  73. code: 1,
  74. msg: '登录成功',
  75. data: { username: doc.username, id: doc._id, loginTime: new Date().getTime() }
  76. }
  77. res.send(sendData)
  78. return
  79. }
  80. // 密码验证不通过
  81. res.send({
  82. code: -1,
  83. msg: '用户名或密码错误'
  84. })
  85. return false
  86. }
  87. // 没有这个用户
  88. res.send({
  89. code: -1,
  90. msg: '用户名还没有注册'
  91. })
  92. }
  93. })
  94. })
  95. // 可以修改启动的服务端口号
  96. let ports = 3000
  97. // process.env.PORT = ports
  98. app.listen(ports, () => {
  99. console.log( ports +'端口监听成功')
  100. })

user.js

  1. const mongoose = require('mongoose');
  2. // 创建一个表结构
  3. var Schema = mongoose.Schema;
  4. var userSchema = new Schema({
  5. username: { type: String, required: true },
  6. password: { type: String, required: true },
  7. create_time: { type: Number, default: Date.now }
  8. });
  9. // 定义一个索引
  10. // userSchema.index({uid: 1, type: 1})
  11. var User = mongoose.model('user', userSchema);
  12. module.exports = User