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 相关文章推荐
Js 本页面传值实现代码
May 17 Javascript
JS input文本框禁用右键和复制粘贴功能的代码
Apr 15 Javascript
javascript函数中的arguments参数
Aug 01 Javascript
AngularJS中取消对HTML片段转义的方法例子
Jan 04 Javascript
JS实现的N多简单无缝滚动代码(包含图文效果)
Nov 06 Javascript
BOM系列第二篇之定时器requestAnimationFrame
Aug 17 Javascript
微信小程序  网络请求API详解
Oct 25 Javascript
微信小程序 五星评价功能的实现
Mar 09 Javascript
js 概率计算(简单版)
Sep 12 Javascript
用Vue.js方法创建模板并使用多个模板合成
Jun 28 Javascript
对layui数据表格动态cols(字段)动态变化详解
Oct 25 Javascript
原生js实现自定义滚动条
Jan 20 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对gzip文件或者字符串解压实例参考
2008/07/25 PHP
php中fsockopen用法实例
2015/01/05 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
PHP addAttribute()函数讲解
2019/02/03 PHP
jQuery 获取对象 定位子对象
2010/05/31 Javascript
js 文本滚动效果的实例代码
2013/08/17 Javascript
jQuery图片轮播的具体实现
2013/09/11 Javascript
javascript中全局对象的parseInt()方法使用介绍
2013/12/19 Javascript
jQuery 无限级菜单的简单实例
2014/02/21 Javascript
javascript实现淘宝幻灯片广告展示效果
2015/04/27 Javascript
基于Jquery和html5实现炫酷的3D焦点图动画
2016/03/02 Javascript
JS仿hao123导航页面图片轮播效果
2016/09/01 Javascript
Node.js利用Net模块实现多人命令行聊天室的方法
2016/12/23 Javascript
Web制作验证码功能实例代码
2017/06/19 Javascript
Require.js的基本用法详解
2017/07/03 Javascript
bootstrap-table组合表头的实现方法
2017/09/07 Javascript
layui.js实现的表单验证功能示例
2017/11/15 Javascript
vue中使用echarts制作圆环图的实例代码
2018/07/27 Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
2020/10/12 Javascript
[02:52]2014DOTA2西雅图国际邀请赛 CIS战队巡礼
2014/07/07 DOTA
Python轻量级ORM框架Peewee访问sqlite数据库的方法详解
2017/07/20 Python
python装饰器深入学习
2018/04/06 Python
Python3之简单搭建自带服务器的实例讲解
2018/06/04 Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
2020/06/02 Python
Python实现播放和录制声音的功能
2020/08/12 Python
pytorch 中forward 的用法与解释说明
2021/02/26 Python
使用CSS3制作饼状旋转载入效果的实例
2015/06/23 HTML / CSS
html5清空画布方法(三种)
2017/10/16 HTML / CSS
Fashion Eyewear美国:英国线上设计师眼镜和太阳镜的零售商
2016/08/15 全球购物
Discard Protocol抛弃协议的作用是什么
2015/10/10 面试题
大学生应聘自荐信
2013/10/11 职场文书
园艺师求职信
2014/03/10 职场文书
受资助学生感谢信
2015/01/21 职场文书
幼儿园三八妇女节活动总结
2015/02/06 职场文书
2015年信息化建设工作总结
2015/07/23 职场文书
快速学习Oracle触发器和游标
2021/06/30 Oracle