下面是详细讲解“Node.js的Koa实现JWT用户认证方法”的完整攻略。
什么是JWT?
JWT全称为JSON Web Token,是一种开放标准(RFC 7519),用于在网络上以JSON的形式安全地传输信息。它可以使用公开密钥,私有密钥或对称密钥来签名,保证信息在传输过程中的完整性和可信性。
JWT的基本结构由三部分组成,分别是Header、Payload和Signature。其中Header用于说明JWT的类型和加密算法,Payload用于存放实际的用户信息,Signature则是根据Header、Payload和密钥使用指定的加密算法生成的。
Koa中使用JWT实现用户认证方法
安装Koa
npm install koa --save
安装koa-router
koa-router是koa的路由中间件,使得koa能够更方便地处理HTTP请求。
npm install koa-router --save
安装jsonwebtoken
jsonwebtoken是一个实现JWT的库,我们可以使用它来生成和验证JWT。
npm install jsonwebtoken --save
实现JWT认证中间件
我们可以在Koa中使用中间件来实现JWT用户认证,以下是实现代码:
const jwt = require('jsonwebtoken');
const secret = 'your secret'; // 密钥
// JWT认证中间件
function jwtAuth(ctx, next) {
let token = ctx.header.authorization;
if (!token) {
ctx.throw(401, '没有权限,请先登录');
}
token = token.replace('Bearer ', '');
try {
const user = jwt.verify(token, secret); // 验证token
ctx.state.user = user; // 将用户信息添加到state中
} catch (err) {
ctx.throw(401, '认证失败,token过期或不正确');
}
return next();
}
module.exports = jwtAuth;
创建路由
这里我们使用koa-router来创建路由,以下是示例代码:
const Koa = require('koa');
const Router = require('koa-router');
const jwt = require('jsonwebtoken');
const jwtAuth = require('./jwtAuth');
const app = new Koa();
const router = new Router();
// 登录接口
router.post('/login', async (ctx, next) => {
const { username, password } = ctx.request.body;
// 这里可以连接数据库查询用户名和密码是否匹配
if (username === 'admin' && password === '123456') {
const token = jwt.sign({ username }, secret, { expiresIn: '1h' }); // 签发token,有效期为1小时
ctx.body = { code: 0, msg: '登录成功', token };
} else {
ctx.throw(401, '用户名或密码不正确');
}
});
// 获取用户信息接口
router.get('/user', jwtAuth, async (ctx, next) => {
const { username } = ctx.state.user;
ctx.body = { code: 0, data: { username } };
});
app.use(router.routes()).use(router.allowedMethods());
app.listen(3000, () => {
console.log('server is running at http://localhost:3000');
});
示例1:用户登录并获取信息
我们可以使用Postman等工具来模拟用户登录并获取信息的过程,以下是示例代码:
登录接口请求方式:POST
请求URL: http://localhost:3000/login
请求参数:
{
"username": "admin",
"password": "123456"
}
响应结果:
{
"code": 0,
"msg": "登录成功",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNjE2Nzg3MTY3LCJleHAiOjE2MTY3OTQzMjd9.Gf2kOJ1sRI2h62Gs5xxLzONYC1-nlQCS4o-9T3Mg5zY"
}
获取用户信息接口请求方式:GET
请求URL: http://localhost:3000/user
请求Header:
{
"Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNjE2Nzg3MTY3LCJleHAiOjE2MTY3OTQzMjd9.Gf2kOJ1sRI2h62Gs5xxLzONYC1-nlQCS4o-9T3Mg5zY"
}
响应结果:
{
"code": 0,
"data": {
"username": "admin"
}
}
示例2:未登录用户访问受保护的接口
以下是示例代码:
获取用户信息接口请求方式:GET
请求URL: http://localhost:3000/user
响应结果:
{
"status": 401,
"message": "没有权限,请先登录"
}
可以看到,未登录的用户访问受保护的接口会返回401状态码和错误信息。
以上就是Node.js的Koa实现JWT用户认证方法的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Node.js的Koa实现JWT用户认证方法 - Python技术站