以下是详细讲解“Node.js Koa2使用JWT进行鉴权的方法示例”的完整攻略。
什么是JWT
JSON Web Token (JWT) 是一个标准,用于在不同的系统之间传输信息作为 JSON 对象。JWT 可以使用秘密(使用 HMAC 算法)或使用 RSA 或 ECDSA 的公钥/私钥对来进行签名。JWT 可以包含用户的身份信息,以及应用程序需要的任何其他元数据。
JWT的三部分
- header(头部):包含了
algorithm
和type
等信息 - payload(载荷):存储有效的信息,如
username
或email
等 - signature(签名):由
header
和payload
加上一个密钥生成的加密字符串
Koa2使用JWT进行鉴权的方法
- 安装 koa-jwt 和 jsonwebtoken
npm install koa-jwt jsonwebtoken
- 在 koa 应用中启用 JWT 鉴权
const Koa = require('koa');
const jwt = require('koa-jwt');
const app = new Koa();
// 密钥,用于生成签名
const secret = 'your secret';
// JWT 鉴权中间件
app.use(jwt({ secret }).unless({ path: [/\/login/] }));
// 定义一个/login路由
app.use(async (ctx, next) => {
if (ctx.url === '/login') {
const token = jwt.sign({ username: 'admin' }, secret, { expiresIn: '1h' });
ctx.body = { token };
} else {
await next();
}
});
// 鉴权后路由处理
app.use(async ctx => {
const user = ctx.state && ctx.state.user;
if (user) {
ctx.body = `Welcome, ${user.username}`;
} else {
ctx.status = 401;
ctx.body = { message: 'Unauthorized' };
}
});
app.listen(3000);
在上述代码中,我们使用了 koa-jwt
这个中间件来对请求进行鉴权。具体而言,我们使用了 unless
方法来指定一些例外路径,如 /login
。如果用户访问的是 /login
路由,则就会生成 token。
使用 koa-jwt
鉴权中间件后,在后续的中间件或路由处理器中,我们就可以通过 ctx.state
来获取到用户名或邮箱等当前用户信息。
示例说明
示例1:登录鉴权
我们首先对用户进行登录验证,并生成 JWT token。具体代码如下:
app.use(async (ctx, next) => {
if (ctx.url === '/login' && ctx.method === 'POST') {
const { username, password } = ctx.request.body;
const user = await User.findOne({ username });
if (user && user.password === password) {
const token = jwt.sign({ id: user._id }, secret, { expiresIn: '1h' });
ctx.body = { token };
} else {
ctx.status = 401;
ctx.body = { message: 'Login failed' };
}
} else {
await next();
}
});
在上述代码中,我们使用了 POST
方法来提交用户的登录信息,如果用户名和密码验证通过,则使用 jwt.sign
方法来生成 token,同时设置 expiresIn
为一个小时后过期。之后,可以将生成的 token 作为登录成功的响应返回给用户。
示例2:获取当前用户信息
在用户进行登录鉴权后,我们需要在后续的路由中对用户进行鉴权,并获取当前用户的信息。具体代码如下:
app.use(jwt({ secret }).unless({ path: [/\/login/] }));
app.use(async (ctx, next) => {
const user = ctx.state.user;
if (!user) {
ctx.status = 401;
ctx.body = { message: 'Unauthorized' };
return;
}
await next();
});
app.use(async (ctx) => {
const user = ctx.state.user;
if (user.role === 'admin') {
// 获取管理员信息
} else {
// 获取普通用户信息
}
});
在上述代码中,我们首先使用了 unless
方法来指定 /login
路由例外,确保用户能够在没有 Token 的情况下进行登录。之后,在路由的处理中使用了 jwt({ secret })
中间件来鉴权用户是否有访问权限,并使用 ctx.state
来获取当前用户的信息。最后根据用户的角色来获取其对应的信息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Node.js Koa2使用JWT进行鉴权的方法示例 - Python技术站