什么是 JWT?
JWT(JSON Web Token)是一种基于 Token 的用户身份认证方式,当用户认证成功后,服务端会生成一段包含用户身份信息的 Token,这个 Token 在客户端存储,每次请求时都携带这个 Token 发送给服务器,服务器使用特定的算法对 Token 进行解密并验证,如果验证成功,则认为请求是合法的。
Token 是一段非常长的字符串,包含三部分,分别是 Header、Payload 和 Signature,其中 Header 和 Payload 都是 JSON 格式的,Signature 是采用指定算法对 Header、Payload 和密钥一起加密后的结果。
为什么要使用 JWT?
使用 JWT 鉴权的优点在于:
- 简单易用:JWT 不需要在服务端存储用户身份信息,只需要在生成 Token 时把用户身份信息加密后加入 Payload 中,减少服务端存储的压力。
- 安全可靠:JWT 采用密钥对 Token 进行加密和解密,只有拥有密钥的人才能对 Token 进行验证和解密,避免了用户信息被泄露的风险。
- 适用于分布式系统:由于 JWT 的 Token 包含了用户的身份信息,因此可以用于分布式系统中,多个服务之间可以共享用户的身份信息。
在 Express.js 中,可以使用 jwt 和 express-jwt 来实现 JWT 鉴权,下面是具体的实现步骤:
步骤1:安装依赖
在项目的根目录下,使用以下命令安装 jwt 和 express-jwt 依赖:
npm install jsonwebtoken express-jwt --save
步骤2:生成 Token
在用户登录成功后,服务器需要生成一个包含用户身份信息的 Token,下面是一个生成 Token 的示例代码:
-- -------------------- ---- ------- ----- --- - ------------------------ ----- ------ - ----------- -- -- --------------------- ----- ---- -- - ----- -------- - ------------------ ----- -------- - ------------------ -- -------------- ----- -- --------- --- ------- -- -------- --- --------- - ----- ------- - - --------- ------- -- ----- ----- - ----------------- ------- - ---------- ---- --- ---------------------- ----- --- - ---- - ---------------------- -------- -------- -------- -- --------- --- - ---
在上面的代码中,使用 jsonwebtoken 的 sign() 方法生成 Token,其中 payload 表示需要加密的用户身份信息,secret 表示加密的密钥,expiresIn 表示 Token 的有效期。
步骤3:设置路由鉴权
在需要进行鉴权的路由中,使用 express-jwt 中间件来对 Token 进行验证,下面是一个设置路由鉴权的示例代码:
const expressJwt = require('express-jwt'); router.get('/protected', expressJwt({ secret }), (req, res) => { res.status(200).json({ message: 'JWT authentication success' }); });
在上面的代码中,使用 express-jwt 中间件来验证 Token,secret 表示解密的密钥,当 Token 校验成功后,会自动把用户身份信息加入 req.user 对象中,可以通过 req.user 访问到用户的身份信息。
步骤4:捕获错误
当 Token 验证失败时,需要捕获相关的错误信息,并返回给客户端,下面是一个捕获错误的示例代码:
router.use(function (err, req, res, next) { if (err.name === 'UnauthorizedError') { res.status(401).json({ message: 'Invalid Token' }); } });
在上面的代码中,使用 express 中的错误处理中间件对错误进行捕获和处理,如果错误类型是 UnauthorizedError,则表示 Token 校验失败,需要返回相关的错误信息。
总结
在 Express.js 中使用 JWT 鉴权可以有效地提升用户身份认证的安全性和可用性,同时应用 JWT 鉴权也可以方便实现分布式系统中的用户身份共享功能。下面是本文的示例代码::
-- -------------------- ---- ------- ----- ------- - ------------------- ----- --- - ------------------------ ----- ---------- - ----------------------- ----- ---------- - ----------------------- ----- --- - ---------- ----- ---- - ----- ----- ------ - ----------- --------------------------- ------------------ ----- ---- -- - ----- -------- - ------------------ ----- -------- - ------------------ -- --------- --- ------- -- -------- --- --------- - ----- ------- - - --------- ------- -- ----- ----- - ----------------- ------- - ---------- ---- --- ---------------------- ----- --- - ---- - ---------------------- -------- -------- -------- -- --------- --- - --- --------------------- ------------ ------ --- ----- ---- -- - ---------------------- -------- ---- -------------- -------- --- --- ---------------- ----- ---- ---- ----- - -- --------- --- -------------------- - ---------------------- -------- -------- ------ --- - --- ---------------- -- -- - ------------------- --------- -- ---- ---------- ---
我们可以使用 Postman 工具进行测试,首先进行登录操作(请求方法:POST,请求地址:http://localhost:3000/login,请求 body:{"username": "admin", "password": "123456"}),成功登录后会返回 Token,接下来在请求头中添加 Autherization 属性,把 Token 作为属性值,然后再请求访问 http://localhost:3000/protected,如果 Token 验证通过,会返回 200 状态码和成功信息,否则会返回 401 状态码和错误信息。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/648d4c2b48841e9894b98492