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


Posted in Javascript onMay 05, 2018

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

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

一、前置知识

  1. 基于Token的身份验证
  2. Koajs 中文文档
  3. Koa 框架教程

二、环境

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

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

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

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

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

const path = require('path');  // 用于处理目录路径
const Koa = require('koa');  // web开发框架
const serve = require('koa-static'); // 静态资源处理
const route = require('koa-route'); // 路由中间件
const jwt = require('jsonwebtoken'); // 用于签发、解析`token`
const jwtKoa = require('koa-jwt'); // 用于路由权限控制
const koaBody = require('koa-body'); // 用于查询字符串解析到`ctx.request.query`
const app = new Koa();
const website = {
 scheme: 'http',
 host: 'localhost',
 port: 1337,
 join: function () {
 return `${this.scheme}://${this.host}:${this.port}`
 }
}

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

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

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

3、注册

/* POST /api/register 注册 */
app.use(route.post('/api/register', async (ctx, next) => {
 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' });
}

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

3、登录

/* GET /api/login 登录 */
app.use(route.get('/api/login', async (ctx, next) => {
 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 })
 }
}));

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

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

4、信息

/* GET /api/info 信息 */
app.use(route.get('/api/info', async (ctx, next) => {
 // 前端访问时会附带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);
}

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

访问需要认证的接口时,需要在request头附带Authorization:Bearer [token]字段。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

原文链接地址:https://segmentfault.com/a/1190000014727547

Javascript 相关文章推荐
jquery插件开发方法(初学者)
Feb 03 Javascript
js解析与序列化json数据(一)json.stringify()的基本用法
Feb 01 Javascript
Jquery 获取指定标签的对象及属性的设置与移除
May 29 Javascript
js表格排序实例分析(支持int,float,date,string四种数据类型)
May 06 Javascript
Javascript中的getUTCDay()方法使用详解
Jun 10 Javascript
JS实现的点击表头排序功能示例
Mar 27 Javascript
JS创建Tag标签的方法详解
Jun 09 Javascript
JSON在Javascript中的使用(eval和JSON.parse的区别)详细解析
Sep 05 Javascript
React Native AsyncStorage本地存储工具类
Oct 24 Javascript
vue 实现复制内容到粘贴板clipboard的方法
Mar 17 Javascript
详解Vue中使用Echarts的两种方式
Jul 03 Javascript
详解如何在Vue项目中导出Excel
Apr 19 Javascript
浅谈vue项目可以从哪些方面进行优化
May 05 #Javascript
Angular模版驱动表单的使用总结
May 05 #Javascript
浅谈Angular HttpClient简单入门
May 04 #Javascript
Vue项目全局配置微信分享思路详解
May 04 #Javascript
vue嵌套路由与404重定向实现方法分析
May 04 #Javascript
Vue.js最佳实践(五招助你成为vuejs大师)
May 04 #Javascript
详解使用jQuery.i18n.properties实现js国际化
May 04 #jQuery
You might like
php中使用getimagesize获取图片、flash等文件的尺寸信息实例
2014/04/29 PHP
php动态生成缩略图并输出显示的方法
2015/04/20 PHP
网页的分页下标生成代码(PHP后端方法)
2016/02/03 PHP
经典的带阴影的可拖动的浮动层
2006/06/26 Javascript
javascript 获取元素位置的快速方法 getBoundingClientRect()
2009/11/26 Javascript
JQuery的一些小应用收集
2010/03/27 Javascript
用jquery设置按钮的disabled属性的实现代码
2010/11/28 Javascript
JS 表单验证大全
2011/11/23 Javascript
jquery 操作iframe的几种方法总结
2013/12/13 Javascript
js鼠标单击和双击事件冲突问题的快速解决方法
2016/07/11 Javascript
如何使用Bootstrap 按钮实例详解
2017/03/29 Javascript
使用nodejs爬取前程无忧前端技能排行
2017/05/06 NodeJs
微信小程序实现左右联动的实战记录
2018/07/05 Javascript
vue-cli 3.x 配置Axios(proxyTable)跨域代理方法
2018/09/19 Javascript
关于Vue Router中路由守卫的应用及在全局导航守卫中检查元字段的方法
2018/12/09 Javascript
vue-cli3 从搭建到优化的详细步骤
2019/01/20 Javascript
node后端服务保活的实现
2019/11/10 Javascript
vue-router之解决addRoutes使用遇到的坑
2020/07/19 Javascript
Vant+postcss-pxtorem 实现浏览器适配功能
2021/02/05 Javascript
[58:25]VP vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python基于Tkinter实现的记事本实例
2015/06/17 Python
一看就懂得Python的math模块
2018/10/21 Python
Python设计模式之组合模式原理与用法实例分析
2019/01/11 Python
python 实现将多条曲线画在一幅图上的方法
2019/07/07 Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
2019/08/27 Python
使用Keras实现Tensor的相乘和相加代码
2020/06/18 Python
canvas画图被放大且模糊的解决方法
2020/08/11 HTML / CSS
荷兰和比利时时尚鞋店:Van Dalen
2018/04/23 全球购物
澳大利亚最受欢迎的美发和美容在线商店:Catwalk
2018/12/12 全球购物
台湾时尚彩瞳专门店:imeime
2019/08/16 全球购物
莫斯科购买书籍网站:Book24
2020/01/12 全球购物
介绍一下mysql的日期和时间函数
2013/03/28 面试题
我的中国梦演讲稿高中篇
2014/08/19 职场文书
先进党员事迹材料
2014/12/24 职场文书
研究生给导师的自荐信
2015/03/06 职场文书
八月一日观后感
2015/06/10 职场文书