在现代 Web 应用中,用户认证和授权是不可或缺的一部分。传统的 cookie/session 认证机制可能会有一些问题,例如跨站攻击 (XSS) 和跨域攻击 (CSRF) 等。因此,使用 JSON Web Token (JWT) 进行身份验证是越来越流行的选择。
本文将介绍如何在 Express.js 中使用 JWT 进行身份验证,包括生成 JWT,验证 JWT 和保护路由等。
什么是 JWT
JWT 是一种基于 JSON 格式的轻量级身份验证机制。它由三部分组成:
- Header: 包含加密算法等元数据
- Payload: 包含身份验证信息,例如用户 ID、角色等
- Signature: 由 Header 和 Payload 构成的字符串按照一定规则加密而成,用于验证 token 是否合法
JWT 的优点在于:
- 不需要使用 cookie/session
- 不需要在服务器端存储 token
- 可以跨域传递
- 可以自定义有效期和权限级别
安装依赖
在使用 JWT 前,需要安装 jsonwebtoken 和 express-jwt 这两个依赖。jsonwebtokens 是一个生成/解析 JWT 的工具,而 express-jwt 则是一个 Express.js 中使用 JWT 的中间件。
可以使用 npm 安装这两个依赖:
npm install jsonwebtoken express-jwt --save
生成 JWT
在用户登录成功后,需要向客户端返回一个 JWT。这个 JWT 可以包含一些用户信息,例如用户 ID、用户名等。可以使用 jsonwebtoken 库来生成这个 JWT。
-- -------------------- ---- ------- ----- ------- - ------------------- ----- --- - ------------------------ ----- --- - ---------- -- -- -------- - -- ------------------ ----- ---- -- - ----- ---- - - --- ---- --------- ----- -- ----- ----- - -------------- --------- - ---------- ---- --- ---------- ----- --- ---
在上面的代码中,我们使用 jwt.sign()
方法生成 JWT。第一个参数是要包含在 JWT 中的用户信息,第二个参数是加密秘钥,第三个参数是 JWT 的有效期。
验证 JWT
在客户端发送请求时,需要将这个 JWT 作为 Authorization header 发送到服务器端。服务器端可以使用 express-jwt 中间件来验证这个 JWT,并获取其中的用户信息。
-- -------------------- ---- ------- ----- ------- - ------------------- ----- --- - ------------------------ ----- ---------- - ----------------------- ----- --- - ---------- -- -- ----------- --- -------------------- ------- -------- ----------- ----- ---------- ---- -- -------- -------------- ----- ---- -- - ----- ---- - --------- --------------- ---
在上面的代码中,我们首先使用 express-jwt 中间件来验证 JWT。{ secret: 'secret' }
表示使用 secret
作为秘钥进行验证。unless
方法表示除了 /login
之外的路由都需要进行 JWT 验证。
如果 JWT 验证通过,通过 req.user
就可以获取当前用户信息。
保护路由
有时候,我们需要保护一些需要授权才能访问的路由。可以使用自定义 middleware 来实现。
-- -------------------- ---- ------- ----- ------- - ------------------- ----- --- - ------------------------ ----- ---------- - ----------------------- ----- --- - ---------- -- -- ----------- --- -------------------- ------- -------- ----------- ----- ---------- ---- -- --- ---------- -------- ---------------- ---- ----- - -- ---------- - ------- - ---- - -------------------- - - -- --------- --- -- --------------------- ------------ ----- ---- -- - ---------- -------- ---------- ------ --- ---
在上面的代码中,我们首先定义了一个自定义 middleware,用来检查当前用户是否已经登录。如果已登录,则继续执行下一个 middleware,否则返回 401。
接着,我们定义了一个受保护的路由 /protected
。这个路由需要经过 JWT 验证,并且需要经过我们定义的自定义 middleware requireAuth
验证。
总结
在本文中,我们介绍了如何在 Express.js 中使用 JWT 进行身份验证。首先我们了解了 JWT 是什么,以及它的优点。接着,我们通过安装依赖的方式引入了 jsonwebtokens 和 express-jwt 两个库。然后,我们介绍了如何生成 JWT 和验证 JWT,并通过自定义 middleware 的方式保护受保护的路由。希望这篇文章对你的学习和开发有所帮助!
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ae4a0f48841e9894a4919f