什么是 JWT 鉴权
JWT(JSON Web Token)是一种用于身份验证的开放标准,它可以在网络应用程序之间安全地传输声明。JWT 由三部分组成,分别是 Header、Payload 和 Signature。其中 Header 和 Payload 部分是 Base64 编码的 JSON 对象,Signature 部分是使用 Header、Payload 和密钥进行加密生成的字符串。
在前后端分离的应用中,前端通常会使用 JWT 来进行用户身份验证。当用户登录时,后端会生成一个 JWT 并返回给前端,前端将 JWT 存储在本地,每次请求时将 JWT 放入请求 Header 中,后端会根据 JWT 中的信息进行身份验证。
1. 安装依赖
首先需要安装以下依赖:
- express:用于构建 web 应用程序
- mongoose:用于操作 MongoDB 数据库
- jsonwebtoken:用于生成和验证 JWT
可以使用以下命令进行安装:
npm install express mongoose jsonwebtoken
2. 构建用户模型
在 MongoDB 数据库中创建一个名为 users
的集合,用于存储用户数据。然后可以使用 Mongoose 构建用户模型,代码如下:
// javascriptcn.com 代码示例 const mongoose = require('mongoose'); const userSchema = new mongoose.Schema({ username: String, password: String, email: String, }); const User = mongoose.model('User', userSchema); module.exports = User;
3. 注册和登录接口
在 Express 中编写注册和登录接口,代码如下:
// javascriptcn.com 代码示例 const express = require('express'); const User = require('./user'); const app = express(); app.use(express.json()); const secretKey = 'my_secret_key'; // 注册接口 app.post('/register', async (req, res) => { const { username, password, email } = req.body; try { const user = new User({ username, password, email }); await user.save(); res.send('注册成功'); } catch (error) { res.status(400).send(error.message); } }); // 登录接口 app.post('/login', async (req, res) => { const { username, password } = req.body; try { const user = await User.findOne({ username }); if (!user || user.password !== password) { throw new Error('用户名或密码错误'); } const token = jwt.sign({ username }, secretKey, { expiresIn: '1h' }); res.send(token); } catch (error) { res.status(400).send(error.message); } }); app.listen(3000, () => console.log('Server started'));
4. 鉴权中间件
编写一个鉴权中间件,用于验证请求中的 JWT 是否有效。代码如下:
// javascriptcn.com 代码示例 const jwt = require('jsonwebtoken'); const secretKey = 'my_secret_key'; const authMiddleware = (req, res, next) => { const token = req.headers.authorization; if (!token) { return res.status(401).send('未授权'); } try { const decoded = jwt.verify(token, secretKey); req.user = decoded; next(); } catch (error) { res.status(401).send('未授权'); } }; module.exports = authMiddleware;
5. 鉴权保护的接口
在 Express 中编写一个需要鉴权保护的接口,代码如下:
// javascriptcn.com 代码示例 const express = require('express'); const User = require('./user'); const authMiddleware = require('./auth'); const app = express(); app.use(express.json()); // 注册和登录接口 // 鉴权保护的接口 app.get('/profile', authMiddleware, async (req, res) => { const { username } = req.user; try { const user = await User.findOne({ username }); res.send(user); } catch (error) { res.status(400).send(error.message); } }); app.listen(3000, () => console.log('Server started'));
总结
本文介绍了如何使用 Mongoose 和 Express 集成 JWT 鉴权。需要注意的是,JWT 只是一种验证方式,不能替代 HTTPS。在实际开发中,需要根据具体情况选择适合的验证方式。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65091a6995b1f8cacd3e4c01