JSON Web Tokens(JWT)是一种基于 JSON 的安全令牌,用于在不同系统之间传递信息。在前端开发中,JWT 被广泛使用来完成用户身份验证和授权。Express.js 是一个流行的 Node.js 框架,它提供了方便的中间件来处理 JWT。在本文中,我们将探讨如何在 Express.js 中使用 JWT 完成身份验证,包括 JWT 的基础知识、在 Express.js 中使用 JWT 的步骤,以及一些实用的示例代码。
JWT 基础知识
在开始使用 JWT 之前,我们需要先了解一些基础知识。JWT 由三部分组成:Header、Payload 和 Signature。它们用一个点号(.)连接在一起组成一个完整的 JWT。
Header
Header 部分通常由两部分组成:令牌类型(typ)和算法(alg)。令牌类型指定为 JWT,算法指定为用于签名 JWT 的 HMAC、RSA 等算法。
比如,以下是一个 JWT 的 Header 示例:
{ "alg": "HS256", "typ": "JWT" }
Payload
在 JWT 的 Payload 中包含了一些关键的数据,比如用户 ID、权限信息等。Payload 可以包含任意数量的键值对,并且可以任意扩展。
比如,以下是一个 JWT 的 Payload 示例:
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
在这个例子中,Payload 中包含了用户的 ID(sub)、用户的名字(name)以及 JWT 的签发时间(iat)。
Signature
Signature 是使用转换后的 Header 和 Payload 进行签名的字符串。使用 Signature 可以确保 JWT 没有被篡改,同时也可以防止未授权的伪造 Token。
比如,以下是一个 JWT 的 Signature 示例:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
其中,secret 是用于生成签名的密钥,这个密钥只有服务器才知道。
在 Express.js 中使用 JWT 的步骤
1. 安装 JWT 库
在使用 JWT 之前,我们需要先安装一个 Node.js 的 JWT 库。比较流行的库有 jsonwebtoken 和 node-jwt-simple,我们可以通过 npm 来安装:
npm install jsonwebtoken
2. 创建 JWT
在 Express.js 中,我们可以通过使用 jsonwebtoken 库来创建 JWT。以下是一个示例代码:
const jwt = require('jsonwebtoken'); const payload = {userId: 12345}; const secretKey = 'secret123'; const token = jwt.sign(payload, secretKey, {expiresIn: '1h'}); console.log(token);
在这个示例中,我们使用 jwt.sign 方法创建了一个 JWT。该方法接受三个参数:
- payload:JWT 的 Payload 数据;
- secretKey:用于签名的秘钥;
- options:一些选项,比如过期时间等。
3. 验证 JWT
在 Express.js 中,我们可以使用中间件来验证 JWT。以下是一个示例代码:
// javascriptcn.com 代码示例 const jwt = require('jsonwebtoken'); app.use((req, res, next) => { const token = req.headers.authorization; if (!token) { return res.status(401).send({message: 'Unauthorized'}); } try { const decoded = jwt.verify(token, secretKey); req.user = decoded; next(); } catch (err) { return res.status(401).send({message: 'Invalid token'}); } });
在这个示例中,我们使用了 Express.js 的中间件来验证 JWT。在每个请求中,我们首先检查 Authorization 头是否包含了 Token。如果没有 Token,我们就返回一个 401 的未授权错误;否则,我们使用 jwt.verify 验证 Token。如果 Token 验证通过,我们将解码后的数据存储在 req.user 中,并通过 next() 继续处理请求;否则,我们返回一个 401 的非法 Token 错误。
实用示例代码
生成 JWT
const jwt = require('jsonwebtoken'); const payload = {userId: 12345}; const secretKey = 'secret123'; const token = jwt.sign(payload, secretKey, {expiresIn: '1h'}); console.log(token);
验证 JWT
// javascriptcn.com 代码示例 const jwt = require('jsonwebtoken'); app.use((req, res, next) => { const token = req.headers.authorization; if (!token) { return res.status(401).send({message: 'Unauthorized'}); } try { const decoded = jwt.verify(token, secretKey); req.user = decoded; next(); } catch (err) { return res.status(401).send({message: 'Invalid token'}); } });
总结
本文介绍了 JWT 的基础知识,以及如何在 Express.js 中使用 JWT 完成身份验证。在实际开发中,我们可以使用 JWT 快速地搭建一个安全的身份验证系统。希望这篇文章对大家有帮助。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654845607d4982a6eb28ce7f