本文介绍了Node.js的Koa实现JWT用户认证方法,分享给大家,具体如下:
一、前置知识
- nofollow" target="_blank" href="http://www.ruanyifeng.com/blog/2017/08/koa.html">Koa 框架教程
二、环境
- Microsoft Visual Studio 2017集成开发环境
- Node.js v8.9.4Javascript运行环境
三、开始动手,一步步来完善
1、创建基础的静态资源服务器、基础架构
以下是基本的代码,实现静态服务器,以及一个当token验证异常时候的处理。
const secret = 'secret';
/ 当token验证异常时候的处理,如token过期、token错误 /
app.use((ctx,next) => {
return next().catch((err) => {
if (err.status === 401) {
ctx.status = 401;
ctx.body = {
ok: false,msg: err.originalError ? err.originalError.message : err.message
}
} else {
throw err;
}
});
});
/ 查询字符串解析到ctx.request.query
/
app.use(koaBody());
/ 路由权限控制 /
// 待办事项……
/ POST /api/register 注册 /
// 待办事项……
/ GET /api/login 登录 /
// 待办事项……
/ GET /api/info 信息 /
// 待办事项……
/ 静态资源处理 /
app.use(serve(path.join(__dirname,'static')));
/ 监听服务器端口 /
app.listen(website.port,() => {
console.log(${website.join()} 服务器已经启动!
);
});
2、路由权限控制
3、注册
// 判断 body.user 和 body.password 格式是否正确
// 待办事项……
// 是否注册成功
let 是否注册成功 = true;
if (是否注册成功) {
// 返回一个注册成功的JOSN数据给前端
return ctx.body = {
ok: true,msg: '注册成功',token: getToken({ user: body.user,password: body.password })
}
} else {
// 返回一个注册失败的JOSN数据给前端
return ctx.body = {
ok: false,msg: '注册失败'
}
}
}));
/ 获取一个期限为4小时的token /
function getToken(payload = {}) {
return jwt.sign(payload,secret,{ expiresIn: '4h' });
}
3、登录
// 判断 query.user 和 query.password 格式是否正确
// 待办事项……
// 判断是否已经注册
// 待办事项……
// 判断姓名、学号是否正确
// 待办事项……
return ctx.body = {
ok: true,msg: '登录成功',token: getToken({ user: query.user,password: query.password })
}
}));
前端获取到token之后,可以保存在任意本地存储里。
4、信息
// 根据 payload.user 查询该用户在数据库中的信息
// 待办事项……
const info = {
name: '御焱',age: 10,sex: '男'
}
let 获取信息成功 = true;
if (获取信息成功) {
return ctx.body = {
ok: true,msg: '获取信息成功',data: info
}
} else {
return ctx.body = {
ok: false,msg: '获取信息失败'
}
}
}));
/ 通过token获取JWT的payload部分 /
function getJWTPayload(token) {
// 验证并解析JWT
return jwt.verify(token.split(' ')[1],secret);
}
访问需要认证的接口时,需要在request头附带Authorization:Bearer [token]字段。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。
原文链接地址:https://segmentfault.com/a/1190000014727547