随着前端技术的不断发展,前后端分离的架构日益成为主流。在这种架构下,前端需要与后端进行接口交互,而常见的认证方式就是 JWT(JSON Web Token)。本文将介绍如何在 Koa 中使用 JWT 进行认证。
什么是 JWT
JWT 是一种用于身份认证的开放标准(RFC 7519),它可以在用户和服务器之间传递安全可靠的信息。它由三部分组成:头部、载荷和签名。头部和载荷都是 JSON 格式的数据,签名是将头部、载荷和密钥组合后生成的一段字符串,用于验证数据的完整性和真实性。
JWT 的优点在于它是无状态的,即服务器不需要保存用户的登录信息,只需要在每次请求中解析 JWT 即可知道用户的身份。此外,JWT 还支持自定义载荷,可以存储用户的其他信息。
在 Koa 中使用 JWT
在 Koa 中使用 JWT,我们需要先安装 koa-jwt 和 jsonwebtoken 两个库。koa-jwt 是一个 Koa 中间件,用于验证 JWT,而 jsonwebtoken 则是用于生成和解析 JWT 的库。
npm install koa-jwt jsonwebtoken
接下来,我们需要编写一个中间件来验证 JWT。这个中间件会在每个请求到达服务器时进行验证,并将解析出的用户信息存储到 ctx.state.user 中。
// javascriptcn.com 代码示例 const jwt = require('jsonwebtoken'); const koaJwt = require('koa-jwt'); const secret = 'my_secret_key'; // 密钥,用于生成和解析 JWT // 验证 JWT 的中间件 const auth = koaJwt({ secret, getToken: ctx => ctx.header.authorization?.split(' ')[1], // 从请求头中获取 JWT }).unless({ path: [/^\/public/, '/login'], // 不需要验证 JWT 的接口 }); module.exports = { auth };
在上面的代码中,我们首先定义了一个密钥 secret,用于生成和解析 JWT。然后使用 koa-jwt 创建了一个中间件 auth,该中间件会从请求头中获取 JWT,并进行验证。最后,我们使用 unless 方法指定了不需要验证 JWT 的接口。
为了使用这个中间件,我们需要在 Koa 应用中使用 app.use(auth) 将其注册:
const Koa = require('koa'); const { auth } = require('./middleware/auth'); const app = new Koa(); app.use(auth); // 注册 JWT 中间件
这样,每个请求到达服务器时,都会先经过 auth 中间件的验证。如果 JWT 验证通过,解析出的用户信息会被存储到 ctx.state.user 中,我们可以在接口中使用这个信息。
// javascriptcn.com 代码示例 const Koa = require('koa'); const Router = require('@koa/router'); const jwt = require('jsonwebtoken'); const secret = 'my_secret_key'; // 密钥,用于生成和解析 JWT const app = new Koa(); const router = new Router(); // 登录接口,用于生成 JWT router.post('/login', ctx => { const { username, password } = ctx.request.body; if (username === 'admin' && password === '123456') { const token = jwt.sign({ username }, secret, { expiresIn: '1h' }); ctx.body = { token }; } else { ctx.status = 401; ctx.body = { message: '用户名或密码错误' }; } }); // 需要验证 JWT 的接口 router.get('/private', ctx => { const { username } = ctx.state.user; // 获取解析出的用户信息 ctx.body = { message: `Hello, ${username}!` }; }); app.use(router.routes()); app.listen(3000);
在上面的代码中,我们定义了一个登录接口 /login,用于生成 JWT。如果用户名和密码正确,则使用 jsonwebtoken 库生成 JWT 并返回给客户端。我们也定义了一个需要验证 JWT 的接口 /private,该接口会在请求到达服务器时经过 auth 中间件的验证,如果 JWT 验证通过,则可以获取解析出的用户信息,并返回一个欢迎消息。
总结
本文介绍了如何在 Koa 中使用 JWT 进行认证,包括生成和解析 JWT,以及使用 koa-jwt 中间件进行验证。JWT 是一种安全可靠的身份认证方式,可以在前后端分离的架构中发挥重要作用。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/656852e9d2f5e1655d11bb2b