什么是 JWT?
JWT,全称为 JSON Web Token,是一种用于身份验证的开放标准。它基于 JSON 格式,通过数字签名来验证数据的完整性和真实性。JWT 由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。
- 头部(Header):包含了两部分信息:令牌类型(即 JWT)和使用的加密算法(比如 HMAC SHA256 或 RSA)。
- 载荷(Payload):包含了需要传递的信息,比如用户的 ID 和角色。
- 签名(Signature):使用密钥对头部和载荷进行加密生成的字符串,用于验证数据的完整性和真实性。
为什么要使用 JWT?
传统的身份验证方式是基于会话的,即用户登录后,在服务端生成一个会话 ID,将其存储在服务端的数据库中,并将该 ID 返回给客户端。客户端在后续的请求中携带该 ID,服务端通过查询数据库验证 ID 的有效性,从而确定用户的身份。
这种方式的缺点在于,服务端需要存储大量的会话信息,会增加服务器的负担和开发的复杂度。而 JWT 则将用户的身份信息存储在令牌中,服务端无需存储任何信息,只需要验证令牌的有效性即可。
Koa2 中使用 JWT 的实现步骤
1. 安装依赖
使用 JWT 需要安装 jsonwebtoken
和 koa-jwt
两个依赖。
npm install jsonwebtoken koa-jwt
2. 生成 JWT
在用户登录成功后,生成 JWT 并返回给客户端。
-- -------------------- ---- ------- ----- --- - ------------------------ ----- --------- - --------- -- --------- --------------------- ----- ----- ----- -- - -- ------ ----- ---- - ----- -------------- --------- ------------------------- --- -- ------ -- ------------------------------------------------- - ---------- - ---- -------- - - -------- ---------- -- ------- - -- -- --- ----- ----- - --------- - ------- --------- --------- ------------- -- ---------- - ---------- ---- - -- ------ - -- -- -------- - - ----- -- ---
3. 验证 JWT
使用 koa-jwt
中间件验证 JWT 的有效性,并将解析后的令牌信息挂载到 ctx.state.user
上。
const jwtMiddleware = require('koa-jwt'); // 需要进行身份验证的路由 router.get('/protected', jwtMiddleware({ secret: secretKey }), async (ctx, next) => { ctx.body = { message: 'Hello, ' + ctx.state.user.username }; });
4. 处理验证失败的情况
如果令牌验证失败,koa-jwt
会抛出一个 UnauthorizedError
异常,我们需要在中间件中捕获该异常并返回错误信息。
-- -------------------- ---- ------- ----- ------------- - ------------------- ----- - ----------------- - - ------------------------------ -- ---------- ------------- ----- ----- -- - --- - ----- ------- - ----- ----- - -- ---- ---------- ------------------ - ---------- - ---- -------- - - -------- -------------- -- - ---- - ----- ---- - - --- -- ----------- ------------------------ --------------- ------- --------- --- ----- ----- ----- -- - -------- - - -------- ------- - - ----------------------- -- ---
总结
使用 JWT 进行身份验证可以减轻服务端的负担,提高系统的可扩展性和安全性。在 Koa2 中,我们可以使用 jsonwebtoken
和 koa-jwt
两个依赖来实现 JWT 的生成和验证。在编写中间件时,我们需要注意处理验证失败的情况,以便返回正确的错误信息。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65c9715fadd4f0e0ff33c4e0