微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Node.js的Koa实现JWT用户认证方法

本文介绍了Node.js的Koa实现JWT用户认证方法分享给大家,具体如下:

一、前置知识

  1. nofollow" target="_blank" href="http://www.ruanyifeng.com/blog/2017/08/koa.html">Koa 框架教程

二、环境

  1. Microsoft Visual Studio 2017集成开发环境
  2. Node.js v8.9.4Javascript运行环境

三、开始动手,一步步来完善

1、创建基础的静态资源服务器、基础架构

以下是基本的代码,实现静态服务器,以及一个当token验证异常时候的处理。

下面我们将在这个基本代码下逐步增加注册登录、信息的功能

/ jwt密钥 /
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、路由权限控制

注册登录接口、其它资源不需要认证,信息接口需要认证。

rush:js;"> /* 路由权限控制 */ app.use(jwtKoa({ secret: secret }).unless({ // 设置login、register接口,可以不需要认证访问 path: [ /^\/api\/login/,/^\/api\/register/,/^((?!\/api).)*$/ // 设置除了私有接口外的其它资源,可以不需要认证访问 ] }));

3、注册

{ const body = ctx.request.body; /* * body = { * user : '御焱',* password : '123456' * } */

// 判断 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、登录

{ const query = ctx.request.query; /* * query = { * user : '御焱',* password : '123456' * } */

// 判断 query.user 和 query.password 格式是否正确
// 待办事项……

// 判断是否已经注册
// 待办事项……

// 判断姓名、学号是否正确
// 待办事项……

return ctx.body = {
ok: true,msg: '登录成功',token: getToken({ user: query.user,password: query.password })
}
}));

前端获取到token之后,可以保存在任意本地存储里。

4、信息

{ // 前端访问时会附带token在请求头 payload = getJWTPayload(ctx.headers.authorization) /* * payload = { * user : "御焱",* iat : 1524042454,* exp : 1524056854 * } */

// 根据 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐