推荐答案
在 Node.js 中实现身份验证和授权通常涉及以下几个步骤:
- 安装依赖:使用
npm或yarn安装必要的包,如express、jsonwebtoken、bcrypt等。 - 创建用户模型:定义用户模型,包括用户名、密码等字段。
- 实现注册和登录功能:
- 注册时,使用
bcrypt对用户密码进行哈希处理并存储。 - 登录时,验证用户提供的密码与存储的哈希密码是否匹配。
- 注册时,使用
- 生成和验证 JWT:
- 登录成功后,使用
jsonwebtoken生成 JWT(JSON Web Token)。 - 在后续请求中,验证 JWT 以确保用户身份。
- 登录成功后,使用
- 实现授权中间件:创建中间件来检查 JWT,并根据用户角色或权限决定是否允许访问特定资源。
本题详细解读
1. 安装依赖
首先,确保你已经安装了 Node.js 和 npm。然后,在项目目录中运行以下命令来安装所需的包:
npm install express jsonwebtoken bcrypt body-parser
2. 创建用户模型
在 models/User.js 文件中定义用户模型:
// www.javascriptcn.com code example
const mongoose = require('mongoose');
const bcrypt = require('bcrypt');
const userSchema = new mongoose.Schema({
username: { type: String, required: true, unique: true },
password: { type: String, required: true },
});
userSchema.pre('save', async function (next) {
if (this.isModified('password')) {
this.password = await bcrypt.hash(this.password, 10);
}
next();
});
module.exports = mongoose.model('User', userSchema);3. 实现注册和登录功能
在 routes/auth.js 文件中实现注册和登录的路由:
// www.javascriptcn.com code example
const express = require('express');
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
const User = require('../models/User');
const router = express.Router();
router.post('/register', async (req, res) => {
const { username, password } = req.body;
try {
const user = new User({ username, password });
await user.save();
res.status(201).send('User registered');
} catch (error) {
res.status(400).send(error.message);
}
});
router.post('/login', async (req, res) => {
const { username, password } = req.body;
try {
const user = await User.findOne({ username });
if (!user) {
return res.status(400).send('User not found');
}
const isMatch = await bcrypt.compare(password, user.password);
if (!isMatch) {
return res.status(400).send('Invalid credentials');
}
const token = jwt.sign({ userId: user._id }, 'your-secret-key', { expiresIn: '1h' });
res.send({ token });
} catch (error) {
res.status(500).send(error.message);
}
});
module.exports = router;4. 生成和验证 JWT
在 middleware/auth.js 文件中创建 JWT 验证中间件:
// www.javascriptcn.com code example
const jwt = require('jsonwebtoken');
module.exports = (req, res, next) => {
const token = req.header('Authorization');
if (!token) {
return res.status(401).send('Access denied. No token provided.');
}
try {
const decoded = jwt.verify(token, 'your-secret-key');
req.user = decoded;
next();
} catch (error) {
res.status(400).send('Invalid token.');
}
};5. 实现授权中间件
在 routes/protected.js 文件中实现一个受保护的路由:
// www.javascriptcn.com code example
const express = require('express');
const auth = require('../middleware/auth');
const router = express.Router();
router.get('/protected', auth, (req, res) => {
res.send('This is a protected route');
});
module.exports = router;6. 整合所有部分
在 app.js 文件中整合所有部分:
// www.javascriptcn.com code example
const express = require('express');
const bodyParser = require('body-parser');
const authRoutes = require('./routes/auth');
const protectedRoutes = require('./routes/protected');
const app = express();
app.use(bodyParser.json());
app.use('/auth', authRoutes);
app.use('/api', protectedRoutes);
app.listen(3000, () => {
console.log('Server is running on port 3000');
});通过以上步骤,你可以在 Node.js 中实现基本的身份验证和授权功能。