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使用ColorBox弹出图片组浏览层实例演示
Mar 14 Javascript
Window.Open如何在同一个标签页打开
Jun 20 Javascript
深入理解JavaScript系列(41):设计模式之模板方法详解
Mar 04 Javascript
基于javascript实现九宫格大转盘效果
May 28 Javascript
Bootstrap 实现查询的完美方法
Oct 26 Javascript
AngularJS的ng Http Request与response格式转换方法
Nov 07 Javascript
H5移动端图片压缩上传开发流程
Nov 09 Javascript
javascript中的try catch异常捕获机制用法分析
Dec 14 Javascript
利用JavaScript如何查询某个值是否数组内
Jul 30 Javascript
JS动态修改网页body的背景色实例代码
Oct 07 Javascript
小程序实现单选多选功能
Nov 04 Javascript
解决vue项目input输入框双向绑定数据不实时生效问题
Aug 05 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中执行系统外部命令
2006/10/09 PHP
php中将数组转成字符串并保存到数据库中的函数代码
2013/09/29 PHP
jquery $.ajax入门应用二
2008/11/19 Javascript
javascript 事件处理程序介绍
2012/06/27 Javascript
js自动闭合html标签(自动补全html标记)
2012/10/04 Javascript
JavaScript 函数参数是传值(byVal)还是传址(byRef) 分享
2013/07/02 Javascript
jquery对table中各数据的增加、保存、删除操作示例
2014/05/14 Javascript
关于javascript模块加载技术的一些思考
2014/11/28 Javascript
js实现一个链接打开两个链接地址的方法
2015/05/12 Javascript
jQuery实现复选框批量选择与反选的方法
2015/06/17 Javascript
谈谈我对JavaScript DOM事件的理解
2015/12/18 Javascript
node.js实现复制文本到剪切板的功能
2017/01/23 Javascript
微信小程序 swiper组件构建轮播图的实例
2017/09/20 Javascript
PHP自动加载autoload和命名空间的应用小结
2017/12/01 Javascript
JavaScript闭包与作用域链实例分析
2019/01/21 Javascript
layui实现根据table数据判断按钮显示情况的方法
2019/09/26 Javascript
Python字符串替换实例分析
2015/05/11 Python
python中私有函数调用方法解密
2016/04/29 Python
python getopt详解及简单实例
2016/12/30 Python
python正则表达式面试题解答
2020/04/28 Python
python爬虫爬取快手视频多线程下载功能
2018/02/28 Python
pygame库实现移动底座弹球小游戏
2020/04/14 Python
Python操作Jira库常用方法解析
2020/04/10 Python
python简单利用字典破解zip文件口令
2020/09/07 Python
纽约现代艺术博物馆商店:MoMA STORE(室内家具和杂货商品)
2016/08/02 全球购物
REISS英国官网:伦敦High Street最受欢迎品牌
2016/12/21 全球购物
马来西亚银饰品牌:JEOEL
2017/12/15 全球购物
艺术用品:Arteza
2018/11/25 全球购物
C&A巴西网上商店:时尚、衣服、手机和鞋子
2020/06/07 全球购物
骨干教师培训感言
2014/01/16 职场文书
2014年客户经理工作总结
2014/11/20 职场文书
小学中队活动总结
2015/05/11 职场文书
2015年度考核个人工作总结
2015/10/24 职场文书
MySQL中in和exists区别详解
2021/06/03 MySQL
与Windows10相比Windows11有哪些改进?值不值得升级?
2021/11/21 数码科技
Redis 哨兵机制及配置实现
2022/03/25 Redis