使用mongoose和bcrypt可以很方便地实现用户密码加密和解密。下面是实现的具体步骤:
- 在Node.js项目中安装mongoose和bcrypt
可以通过npm命令在项目中安装mongoose和bcrypt:
npm install mongoose bcrypt --save
- 创建一个mongoose模型
创建一个user模型来存储用户的信息,包括用户名和密码。在模型中需要定义一个pre(‘save’)的hook,在保存用户信息之前对密码进行加密。
const mongoose = require('mongoose');
const bcrypt = require('bcrypt');
const userSchema = new mongoose.Schema({
username: {
type: String,
required: true,
unique: true,
trim: true
},
password: {
type: String,
required: true,
trim: true
}
});
userSchema.pre('save', async function(next) {
const user = this;
if (user.isModified('password')) {
user.password = await bcrypt.hash(user.password, 8);
}
next();
});
const User = mongoose.model('User', userSchema);
module.exports = User;
- 创建一个控制器来处理用户的注册和登录请求
在控制器中,可以利用mongoose提供的findOne方法来查询用户信息。在登录的时候,需要使用bcrypt提供的compare方法来验证用户密码是否正确。
const User = require('../models/user');
exports.register = async (req, res) => {
const user = new User(req.body);
try {
await user.save();
res.status(201).send(user);
} catch (error) {
res.status(400).send(error);
}
};
exports.login = async (req, res) => {
try {
const user = await User.findOne({ username: req.body.username });
if (!user) {
return res.status(404).send({ error: 'User not found' });
}
const isMatch = await bcrypt.compare(req.body.password, user.password);
if (!isMatch) {
return res.status(400).send({ error: 'Invalid login credentials' });
}
res.send(user);
} catch (error) {
res.status(500).send(error);
}
};
- 在路由中使用控制器来处理请求
将控制器中的register和login方法分别绑定到路由的POST方法中,用于处理用户的注册和登录请求。
const express = require('express');
const userController = require('../controllers/user');
const router = express.Router();
router.post('/register', userController.register);
router.post('/login', userController.login);
module.exports = router;
- 完整示例
下面是一个完整的示例,使用Express和MongoDB来创建一个用户注册和登录的API。
const express = require('express');
const mongoose = require('mongoose');
const userRouter = require('./routers/user');
const app = express();
const mongoDBURL = 'mongodb://localhost:27017/myapp';
mongoose.connect(mongoDBURL, {
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true,
useFindAndModify: false
});
app.use(express.json());
app.use(userRouter);
app.listen(3000, () => {
console.log('Server is up and running on port 3000');
});
- 示例说明
(1)注册用户示例:
请求URL:POST http://localhost:3000/register
请求Body:
{
"username": "admin",
"password": "123456"
}
响应结果:
HTTP状态码:201
{
"_id": "5fd2f695471cb02f58db9019",
"username": "admin",
"password": "$2b$08$Lb9ZGeDUfdUKLr.CqD0asOuc107t3gM7mq3cqk0GJOsMkI96o/3v2",
"__v": 0
}
(2)登录用户示例:
请求URL:POST http://localhost:3000/login
请求Body:
{
"username": "admin",
"password": "123456"
}
响应结果:
HTTP状态码:200
{
"_id": "5fd31e783636d224d4d38437",
"username": "admin",
"password": "$2b$08$jKF7WbPGqWrNfpMN02UHluW4jWkZz5R7Vx4JWigfG5kCj06fpPpwK",
"__v": 0
}
以上便是使用mongoose和bcrypt实现用户密码加密的完整攻略,其中包含了模型定义、控制器编写、路由设置等细节,可以帮助开发者实现安全稳定的用户认证和授权。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用mongoose和bcrypt实现用户密码加密的示例 - Python技术站