那个网站可以找人做兼职,工程项目信息查询平台,商丘做网站公司新站seo快速收录网站内容页的方法,wordpress站群代身份验证与授权是现代Web应用中不可或缺的部分。了解如何在Node.js应用中实施这些机制#xff0c;将使你能够构建更安全、更可靠的应用程序。本文将引导你通过使用JWT实现用户注册、登录和权限控制的过程。 JWT#xff08;Json Web Token#xff09;
JWT是一种用于双方之间… 身份验证与授权是现代Web应用中不可或缺的部分。了解如何在Node.js应用中实施这些机制将使你能够构建更安全、更可靠的应用程序。本文将引导你通过使用JWT实现用户注册、登录和权限控制的过程。 JWTJson Web Token
JWT是一种用于双方之间安全地传输信息的简洁的、URL安全的表示声明的方法。它由三部分组成头部Header、载荷Payload、签名Signature。
JWT的实现步骤
安装依赖
首先安装JWT相关的npm包
npm install jsonwebtoken --save创建JWT
在用户登录成功后你需要创建一个token发送给用户
const jwt require(jsonwebtoken);const user { id: user.id }; // 用户的唯一标识
const secret your_secret_key; // 保持安全的秘钥
const token jwt.sign(user, secret, { expiresIn: 1h }); // 有效期1小时验证JWT
创建一个中间件来验证每次请求的JWT
function authenticateToken(req, res, next) {const authHeader req.headers[authorization];// 从请求头中获取authorization字段const token authHeader authHeader.split( )[1];if (token null) return res.sendStatus(401);// 如果没有token则返回401jwt.verify(token, your_secret_key, (err, user) {if (err) return res.sendStatus(403);// 如果token验证失败则返回403req.user user;next();});
}权限控制
使用前面创建的authenticateToken中间件来控制访问特定路由的权限
app.get(/protected, authenticateToken, (req, res) {res.json({ message: This is protected });// 这个路由现在受到保护只有带有有效JWT的请求才能访问
});结合Express MongoDB JWT 示例
准备工作
安装必要的npm包
npm install express mongoose4.4.0 jsonwebtoken bcryptjs body-parser --save这些包包括Express框架、MongooseMongoDB的ODM、jsonwebtoken用于JWT操作、bcryptjs用于密码加密和body-parser用于解析请求体。
启动MongoDB服务
确保MongoDB服务在本地运行或者你有一个MongoDB Atlas云服务的实例。
mongo开始
设置Express应用
const express require(express); // 引入express模块
const bodyParser require(body-parser); // 引入body-parser模块用于解析请求体
const mongoose require(mongoose); // 引入mongoose模块连接MongoDB
const { register, login, authenticateToken } require(./controllers/authController); // 引入控制器const app express(); // 创建express应用
const PORT process.env.PORT || 3000; // 定义端口号app.use(bodyParser.json()); // 使用body-parser中间件解析JSON格式请求体
// 构建MongoDB连接的URL
const url mongodb://localhost:27017/mydb; // 这里将地址和数据库名拼接在了一起
// 连接到MongoDB数据库
//mongoose.connect方法用于初始化数据库连接。
//它接受两个参数
//第一个参数是MongoDB的连接字符串
//第二个参数是一个选项对象
//这里使用了useNewUrlParser和useUnifiedTopology选项
//以使用新的URL解析器和驱动引擎这两个选项有助于避免一些常见的连接警告。
mongoose.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }).then(() console.log(MongoDB connected)) // 连接成功后打印消息.catch(err console.log(err)); // 连接失败打印错误信息// 注册和登录路由
app.post(/register, register);
app.post(/login, login);// 受保护的路由示例使用authenticateToken中间件保护
app.get(/protected, authenticateToken, (req, res) {res.json({ message: This is protected }); // 受保护的资源
});// 启动服务器
app.listen(PORT, () {console.log(Server is running on port ${PORT});
});创建User模型
在models/User.js中
const mongoose require(mongoose); // 引入mongoose模块// 定义用户模型的schema
const userSchema new mongoose.Schema({username: { type: String, required: true, unique: true }, // 用户名必填唯一password: { type: String, required: true } // 密码必填
});// 导出模型
module.exports mongoose.model(User, userSchema);实现注册与登录逻辑
在controllers/authController.js中
const bcrypt require(bcryptjs); // 引入bcryptjs用于密码加密
const jwt require(jsonwebtoken); // 引入jsonwebtoken用于生成JWT
const User require(../models/User); // 引入User模型// 注册逻辑
exports.register async (req, res) {const { username, password } req.body; // 从请求体获取用户名和密码const hashedPassword await bcrypt.hash(password, 10); // 对密码进行加密try {// 创建新用户并保存到数据库const newUser await User.create({ username, password: hashedPassword });res.status(201).json(newUser); // 发送201响应和新用户信息} catch (error) {res.status(500).json({ error: error.message }); // 发送500响应和错误信息}
};// 登录逻辑
exports.login async (req, res) {const { username, password } req.body; // 从请求体获取用户名和密码const user await User.findOne({ username }); // 查找用户// 如果用户不存在或密码错误if (!user || !(await bcrypt.compare(password, user.password))) {return res.status(401).send(Invalid credentials); // 发送401响应}// 生成JWTconst token jwt.sign({ userId: user._id }, your_secret_key, { expiresIn: 1h });res.json({ token }); // 发送包含JWT的响应
};// JWT验证中间件
exports.authenticateToken (req, res, next) {const authHeader req.headers[authorization]; // 获取请求头中的authorization字段const token authHeader authHeader.split( )[1]; // 提取tokenif (!token) return res.sendStatus(401); // 如果没有token发送401响应// 验证tokenjwt.verify(token, your_secret_key, (err, decoded) {if (err) return res.sendStatus(403); // 如果验证失败发送403响应req.userId decoded.userId; // 将解码的用户ID添加到请求对象next(); // 调用下一个中间件});
};测试
使用Postman或任何API测试工具先调用/register端点注册新用户。使用注册信息调用/login端点你会收到一个JWT。尝试访问/protected端点把JWT添加到请求头中通常是Authorization: Bearer your_token。如果一切配置正确你应该能够访问受保护的路由。
http://localhost:3000/register
http://localhost:3000/login 未加token访问http://localhost:3000/protected 加token访问http://localhost:3000/protected
总结
本文介绍了如何在Node.js应用中实现用户身份验证和授权特别是通过使用Node.js、Express和MongoDB实现JWT基于的身份验证和授权的全面指导包括注册、登录和访问受保护资源的流程。这为构建安全的Web应用程序奠定了坚实的基础。