在现代 Web 应用程序的开发中,认证和授权是非常重要的。JSON Web Token(JWT)是一种基于 Web 的指定的授权机制,它使用 JSON 信息来安全地传输信息,并且可以在不同的应用程序之间进行验证和共享。
在使用 Express.js 框架开发 Web 应用程序时,处理 JWT 变得非常容易。本文将介绍如何在 Express.js 框架中使用 JWT,包括如何生成和验证 JWT 以及如何在路由中使用它们。
安装依赖
首先,需要安装需要的依赖项。使用 npm 或 yarn 安装以下依赖:
npm i jsonwebtoken express-jwt bcrypt
jsonwebtoken
:JWT 的 JavaScript 实现。express-jwt
:提供了一个用于验证 JWT 的中间件。bcrypt
:用于加密用户的密码。
生成和签发 JWT
首先,需要定义一个加密密钥。在编写代码之前,应该至少为生产环境配置一个随机的加密密钥。在本文中,我们将使用示例密钥 secret
,但这并不适用于生产。
const jwt = require('jsonwebtoken') const secret = 'secret'
接下来,定义生成 JWT 的函数:
-- -------------------- ---- ------- -------- ------------------- - ----- ------- - - ---- -------- ---- ---------- - ----- ---- ---------- - ---- - -- - -- - -- -- ------- - ----- ----- - ----------------- ------- ------ ----- -
sub
:JWT 的主题,即用户 ID。iat
:JWT 的发行时间。exp
:JWT 的过期时间。
使用 jwt.sign()
函数和定义的密钥 secret
,将 payload
加密生成一个 JWT。
验证 JWT
对于使用 JWT 进行身份验证的路由,需要验证请求头中的 JWT。使用 express-jwt
中间件来实现 JWT 的验证。
const expressJwt = require('express-jwt') app.get('/protected', expressJwt({ secret }), (req, res) => { res.send('Hello World') })
expressJwt
函数需要传递一个参数 secret
。在本示例中,使用定义的密钥 secret
进行验证。
expressJwt
中间件将请求中的 JWT 解码并验证其签名和过期时间。如果 JWT 未过期,且签名有效,则 req.user
对象将包含 JWT 的原始 payload
。
使用 JWT
假设有一个简单的用户身份验证路由:
-- -------------------- ---- ------- ------------------------- ----- ---- -- - ----- - --------- -------- - - -------- ----- ---- - --------------------------- -- ------- - ----------------------------- -------- -- ---------- ------ - -- ---------------------------- --------------- - ----------------------------- -------- -- ---------- ------ - ----- ----- - ------------------- --------------- --
在使用 generateToken()
函数生成 JWT 后,将 JWT 发送回客户端,客户端将在后续的请求中使用 JWT 进行身份验证:
-- -------------------- ---- ------- --------------------------- - --------- ------- --------- ---------- ---------------- -- - ----- ----- - ------------- ----------------------- - -------- - -------------- ------- --------- - ---------------- -- - -------------------------- -- --
在请求头中添加 JWT,使用 Bearer
方案来传递 JWT:
headers: { Authorization: `Bearer ${token}` }
结论
在 Express.js 中使用 JWT 进行身份验证非常方便。在定义过程中,需要注意加密密钥的安全性,以避免恶意攻击。同时,可以在路由中使用 express-jwt
中间件来验证传入的 JWT,确保使用合法的 JWT 进行用户身份验证。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/674eec0de884a3e30f2af471