3. 实现JWT Token

 本文只作为个人学习时的摘要,如果想具体的学习,可以翻到文章底部

下图中红色方框标出来的内容,是springSecurity中使用jwt之前的一些准备,这些代码干的事情简略的说是:

    生成jwt对应的token, 生成完的token使用rsa进行加密。JwtTokenGenerator 可以编码/解码验证 Jwt Token 对 ,通过 JwtTokenStorage 来处理 Jwt Token 缓存。缓存这里用了Spring Cache Ehcache 来实现,也可以切换到 Redis 。

RSA使用的证书,这里我们使用 JDK 提供的证书管理工具 Keytool 来生成 RSA 证书 ,格式为 jks 格式。

文章相关代码转载来自 https://www.felord.cn/categories/spring-security/ ,感谢大佬的分享哈

### 如何在 Node.js 中使用 JWT 实现 Token 登录验证 以下是基于 `jsonwebtoken` 和其他必要依赖项的完整示例,展示如何在 Node.js 中实现基于 JWT 的用户登录和身份验证。 #### 安装必要的依赖包 为了实现此功能,需要安装以下模块: - **express**: 构建服务器端 API。 - **jsonwebtoken**: 生成和解析 JSON Web Tokens (JWT)。 - **bcryptjs**: 加密用户密码以便存储和比较。 运行以下命令以安装这些依赖项: ```bash npm install express jsonwebtoken bcryptjs body-parser ``` --- #### 创建项目结构并初始化服务 创建一个简单的 Express 应用来处理用户的注册、登录以及受保护路由的身份验证。 ##### 初始化文件 (`app.js`) ```javascript const express = require(&#39;express&#39;); const bodyParser = require(&#39;body-parser&#39;); const bcrypt = require(&#39;bcryptjs&#39;); const jwt = require(&#39;jsonwebtoken&#39;); // 配置中间件 const app = express(); app.use(bodyParser.json()); // 假设这是数据库中的用户数据(实际开发中应连接真实数据库) let users = []; // 密钥用于签名 JWT const SECRET_KEY = &#39;your_secret_key_here&#39;; // 注册新用户 app.post(&#39;/register&#39;, async (req, res) => { try { const { username, password } = req.body; // 检查用户名是否存在 if (users.find(user => user.username === username)) { return res.status(409).send({ message: &#39;Username already exists!&#39; }); } // 对密码进行哈希加密 const hashedPassword = await bcrypt.hash(password, 8); // 存储用户信息 const newUser = { username, password: hashedPassword }; users.push(newUser); res.send({ message: &#39;User registered successfully!&#39;, user: newUser }); } catch (error) { res.status(500).send({ message: error.message || &#39;Some error occurred while registering.&#39; }); } }); // 用户登录 app.post(&#39;/login&#39;, async (req, res) => { try { const { username, password } = req.body; const user = users.find(u => u.username === username); if (!user) { return res.status(404).send({ message: &#39;User not found!&#39; }); } // 验证密码是否匹配 const isMatched = await bcrypt.compare(password, user.password); if (!isMatched) { return res.status(401).send({ accessToken: null, message: &#39;Invalid Password!&#39; }); } // 如果成功,则签发 JWT const token = jwt.sign({ id: user.id, username: user.username }, SECRET_KEY, { expiresIn: &#39;1h&#39; }); res.send({ message: &#39;Login successful!&#39;, accessToken: token, }); } catch (error) { res.status(500).send({ message: error.message || &#39;Some error occurred while logging in.&#39; }); } }); // 受保护的路由 function authenticateToken(req, res, next) { const authHeader = req.headers[&#39;authorization&#39;]; const token = authHeader && authHeader.split(&#39; &#39;)[1]; if (!token) { return res.sendStatus(401); } jwt.verify(token, SECRET_KEY, (err, decoded) => { if (err) { return res.sendStatus(403); } req.user = decoded; // 将解码后的用户信息附加到请求对象上 next(); // 继续执行后续逻辑 }); } app.get(&#39;/protected-route&#39;, authenticateToken, (req, res) => { res.send(`Welcome ${req.user.username}! This route is protected.`); }); // 启动服务器 const PORT = process.env.PORT || 3000; app.listen(PORT, () => console.log(`Server running on port ${PORT}`)); ``` --- #### 示例解释 上述代码实现了以下几个核心功能: 1. **用户注册** 使用 `bcrypt` 来加密用户输入的密码,并将其保存在一个模拟数组中。如果用户名已存在,则返回错误消息[^3]。 2. **用户登录** 当用户提供有效的用户名和密码时,程序会通过 `bcrypt.compare()` 方法验证密码是否正确。如果验证成功,则生成一个带有过期时间的 JWT 并返回给客户端[^1]。 3. **受保护路由访问控制** 利用自定义中间件函数 `authenticateToken`,拦截对 `/protected-route` 路由的请求,检查是否有合法的 JWT 提供授权。如果没有提供有效令牌或者令牌无效,则拒绝访问[^2]。 --- #### 测试流程 1. 发送 POST 请求至 `/register` 接口完成用户注册操作。 2. 使用相同的账户发送 POST 请求至 `/login` 获取 JWT 访问令牌。 3. 在获取到的有效期内尝试 GET 请求访问 `/protected-route`,需携带 Authorization Header 设置为 Bearer `<access_token>` 形式。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

65页ppt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值