在 RESTful API 中使用 JWT 进行身份认证
在现代 Web 应用程序中,RESTful API 已经成为了通用的数据交换协议。行之有效的 RESTful API 不仅仅代表了一种标准化的数据格式,也代表了一种可扩展性的实现。但是,在开发 RESTful API 时,路由和数据格式并不足以实现数据安全问题,这一点是需要额外注意的。为了解决此类问题,我们可以引入身份认证和授权机制。本文将详细介绍在 RESTful API 中使用 JWT 进行身份认证。
JWT 是什么?
JWT (Json Web Token)是一种用于身份认证的标准化 RFC(RFC 7519)。它是一个JSON格式的Web Token,可以包含基础数据(称为 Payload)和不同的签名算法(称为 Signature)。JWT 通常被用于用户认证或其他应用程序之间的信息传递,并且可以降低跨域身份验证。
JWT 工作原理
当用户以用户名/密码的方式登录系统时,系统将验证这些凭证,如果有效则会生成 JWT。JWT 将在浏览器作为标头信息发送回客户端,以便保存客户端的状态以便随后访问的API。每次使用 JWT 访问API时,JWT 将被放置在 HTTP 代理中,以便于后端 API 服务器进行验证,以验证请求中的重要内容 -- 用户的身份信息。
下图展示了一个 JWT 的结构:
Payload 包含需要传输的数据,可以是一个简单的用户 ID 或其他数据。虽然数据不敏感,但因为 JWT 是可逆的,所以我们要确保不将敏感数据放在数据部分。
编写后端
下面我们来学习一个编写后端的示例。首先,安装需要的依赖包:
npm install express cors jsonwebtoken
现在,我们打算使用以下路由。
// javascriptcn.com 代码示例 const JWT_SECRET = 'myS3cr3tK3Y'; const jwt = require('jsonwebtoken'); const express = require('express'); const router = express.Router(); const cors = require('cors'); router.use(cors()); // 此处省略了实际处理逻辑,请自行补充 router.post('/login', function(req, res) { const name = req.body.name; const pass = req.body.pass; // 根据用户名和密码从数据库中查询数据 const user = User.findOne({username: name, password: pass}); const payload = { sub: user._id, iat: Date.now() }; const token = jwt.sign(payload, JWT_SECRET, {expiresIn: '1h'}); res.status(200).json({token: token}); });
在上述代码中,当用户登录时,我们将收到用户的身份验证凭证。这些凭证将被保存在 payload 中。我们的服务器将该 payload 转换为一个 JWT 并将其作为响应发送给客户端。
接下来,让我们看一下实际的API调用。此处我们会添加一个JWT验证中间件。
// javascriptcn.com 代码示例 const JWT_SECRET = 'myS3cr3tK3Y'; const jwt = require('jsonwebtoken'); const express = require('express'); const router = express.Router(); const cors = require('cors'); router.use(cors()); router.use((req, res, next) => { const token = req.get('Authorization'); if(token) { try { const decodedPayload = jwt.verify(token, JWT_SECRET); req.userId = decodedPayload.sub; next(); } catch(err) { return res.status(401).json({ error: 'Failed to authenticate token' }); } } else { return res.status(401).json({ error: 'No token provided' }); } }); router.get('/hello', (req, res) => { res.status(200).send(`Hello User ID: ${req.userId}!`); }));
在上述代码中,API 访问路由有一个中间件 jwtVerify,它验证 Authorization 标头中的 JWT,并从中解析 userId,在路由逻辑中使用该 userId 变量。
总结
在 RESTful API 中使用 JWT 进行身份认证是一种流行的解决方案。JWT 旨在使开发人员使用加密技术来保护应用程序,以确保对端点和资源的安全访问。在本文中,我们深入介绍了 JWT 的原理和使用方法,同时也给出了相应的代码示例。对前端开发人员来说,掌握 JWT 身份验证技术是至关重要的。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65437df17d4982a6ebd4846d