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自执行函数之伪命名空间封装法
Dec 25 Javascript
eclipse导入jquery包后报错的解决方法
Feb 17 Javascript
jQuery实现行文字链接提示效果的方法
Mar 10 Javascript
jquery中的常见问题及快速解决方法小结
Jun 14 Javascript
jQuery validate插件功能与用法详解
Dec 15 Javascript
javascript代码优化的8点总结
Jan 29 Javascript
微信小程序实现人脸识别
May 25 Javascript
vue-cli配置环境变量的方法
Jul 09 Javascript
微信小程序中上传图片并进行压缩的实现代码
Aug 28 Javascript
ES6 迭代器与可迭代对象的实现
Feb 11 Javascript
使用vue制作滑动标签
Sep 21 Javascript
ztree+ajax实现文件树下载功能
May 18 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中MVC的开发经验分享
2012/05/17 PHP
php学习笔记之面向对象编程
2012/12/29 PHP
PHP 7.4中使用预加载的方法详解
2019/07/08 PHP
PHP PDO和消息队列的个人理解与应用实例分析
2019/11/25 PHP
JavaScript NaN和Infinity特殊值 [译]
2012/09/20 Javascript
JS之Date对象和获取系统当前时间详解
2014/01/13 Javascript
document.compatMode的CSS1compat使用介绍
2014/04/03 Javascript
JavaScript-RegExp对象只能使用一次问题解决方法
2014/06/23 Javascript
jQuery $命名冲突解决方案汇总
2014/11/13 Javascript
Javascript实现图片加载从模糊到清晰显示的方法
2016/06/21 Javascript
js本地图片预览实现代码
2016/10/09 Javascript
Vue实现动态响应数据变化
2017/04/28 Javascript
Angular 2父子组件数据传递之@Input和@Output详解(下)
2017/07/05 Javascript
vue计算属性和监听器实例解析
2018/05/10 Javascript
vue二级菜单导航点击选中事件的方法
2018/09/12 Javascript
微信小程序带动画弹窗组件使用方法详解
2018/11/27 Javascript
你可能不知道的CORS跨域资源共享
2019/03/13 Javascript
[49:08]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
[01:15:16]DOTA2-DPC中国联赛 正赛 Elephant vs Aster BO3 第一场 1月26日
2021/03/11 DOTA
Python中logging模块的用法实例
2014/09/29 Python
Centos5.x下升级python到python2.7版本教程
2015/02/14 Python
python开发之thread实现布朗运动的方法
2015/11/11 Python
举例讲解Python中字典的合并值相加与异或对比
2016/06/04 Python
修改python plot折线图的坐标轴刻度方法
2018/12/13 Python
python3.7 使用pymssql往sqlserver插入数据的方法
2019/07/08 Python
基于python框架Scrapy爬取自己的博客内容过程详解
2019/08/05 Python
Numpy中对向量、矩阵的使用详解
2019/10/29 Python
python将数据插入数据库的代码分享
2020/08/16 Python
html5如何在Canvas中实现自定义路径动画示例
2017/09/18 HTML / CSS
美国休闲服装品牌:Express
2016/09/24 全球购物
Smilodox官方运动服装店:从运动服到健身配件
2020/08/27 全球购物
说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法
2012/05/24 面试题
董事长助理岗位职责
2014/02/18 职场文书
小学生母亲节演讲稿
2014/05/07 职场文书
教师节祝酒词
2015/08/11 职场文书
vue使用v-model进行跨组件绑定的基本实现方法
2021/04/28 Vue.js