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 相关文章推荐
javascript 点击整页变灰的效果(可做退出效果)。
Jan 09 Javascript
javascript中将Object转换为String函数代码 (json str)
Apr 29 Javascript
浅谈javascript的Touch事件
Sep 27 Javascript
jQuery中的siblings用法实例分析
Dec 24 Javascript
浅谈javascript的call()、apply()、bind()的用法
Feb 21 Javascript
Vue.js仿Metronic高级表格(二)数据渲染
Apr 19 Javascript
解决bootstrap中使用modal加载kindeditor时弹出层文本框不能输入的问题
Jun 05 Javascript
Angular2实现组件交互的方法分析
Dec 19 Javascript
基于Vue的延迟加载插件vue-view-lazy
May 21 Javascript
详解Vue组件插槽的使用以及调用组件内的方法
Nov 13 Javascript
利用Vue构造器创建Form组件的通用解决方法
Dec 03 Javascript
简述Vue中容易被忽视的知识点
Dec 09 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使用Jpgraph绘制饼状图的方法
2015/06/10 PHP
PHP正则删除HTML代码中宽高样式的方法
2017/06/12 PHP
PHP chop()函数讲解
2019/02/11 PHP
Laravel修改验证提示信息为中文的示例
2019/10/23 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
javascript 支持ie和firefox杰奇翻页函数
2008/07/22 Javascript
javascript中定义类的方法汇总
2014/12/28 Javascript
javascript实现dom元素可拖动
2016/03/21 Javascript
郁闷!ionic中获取ng-model绑定的值为undefined如何解决
2016/08/27 Javascript
微信小程序顶部可滚动导航效果
2017/10/31 Javascript
vue和webpack打包项目相对路径修改的方法
2018/06/15 Javascript
详解webpack import()动态加载模块踩坑
2018/07/17 Javascript
vue中filters 传入两个参数 / 使用两个filters的实现方法
2019/07/15 Javascript
区分vue-router的hash和history模式
2020/10/03 Javascript
Python读写Excel文件的实例
2013/11/01 Python
python冒泡排序简单实现方法
2015/07/09 Python
python3+PyQt5+Qt Designer实现扩展对话框
2018/04/20 Python
在Python中居然可以定义两个同名通参数的函数
2019/01/31 Python
Python基于机器学习方法实现的电影推荐系统实例详解
2019/06/25 Python
Python处理时间日期坐标轴过程详解
2019/06/25 Python
python快速排序的实现及运行时间比较
2019/11/22 Python
python怎么删除缓存文件
2020/07/19 Python
python tkinter的消息框模块(messagebox,simpledialog)
2020/11/07 Python
python爬虫筛选工作实例讲解
2020/11/23 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
2020/12/14 Python
Html5调用手机摄像头并实现人脸识别的实现
2018/12/21 HTML / CSS
荷兰超市:DEEN
2018/03/14 全球购物
美国转售二手商品的电子商务平台:BLINQ
2018/12/13 全球购物
德国前卫设计师时装在线商店:Luxury Loft
2019/11/04 全球购物
人力资源求职信
2014/05/25 职场文书
乡镇保密工作责任书
2014/07/28 职场文书
作文评语怎么写
2014/12/25 职场文书
前台接待岗位职责
2015/02/03 职场文书
2016入党积极分子党课学习心得体会
2015/10/09 职场文书
Java org.w3c.dom.Document 类方法引用报错
2021/08/07 Java/Android
python创建字典及相关管理操作
2022/04/13 Python