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' });
}

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 })
 }
}));

前端获取到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);
}

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

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

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

您可能感兴趣的文章:

  • Koa项目搭建过程详细记录
  • vue2.0+koa2+mongodb实现注册登录
  • Koa2 之文件上传下载的示例代码
  • 详解React项目的服务端渲染改造(koa2+webpack3.11)
  • jQuery+koa2实现简单的Ajax请求的示例
  • 浅谈Koa2框架利用CORS完成跨域ajax请求
  • nodejs中Express与Koa2对比分析
  • 理解Koa2中的async&await的用法
(0)

相关推荐

  • 浅谈Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置. 本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明(深层次的配置我也不会). CORS将请求分为简单请求和非简单请求,可以简单的认为,简单请求就是没有加上额外请求头部的get和post请求,并且如果是post请求,请求格式不能是application/json(因为我对这一块理解不深如果错误希望能有人指出错误并提出修改意见).而其余的,put.post请求,Content-Type为appl

  • Koa项目搭建过程详细记录

    本文介绍了Koa项目搭建过程详细记录,分享给大家,具体如下: Java中的Spring MVC加MyBatis基本上已成为Java Web的标配.Node JS上对应的有Koa.Express.Mongoose.Sequelize等.Koa一定程度上可以说是Express的升级版.许多Node JS项目已开始使用非关系型数据库(MongoDB).Sequelize对非关系型数据库(MSSQL.MYSQL.SQLLite)做了支持. Koa项目构建 cnpm install -g koa-gene

  • vue2.0+koa2+mongodb实现注册登录

    前言 前段时间和公司一个由技术转产品的同事探讨他的职业道路,对我说了一句深以为然的话: "不要把自己禁锢在某一个领域,技术到产品的转变,首先就是思维上的转变.你一直做前端,数据的交互你只知道怎么进,却不知道里面是怎么出的,这就是局限性." 醍醐灌顶般,刚好学习vue的时候看到有个注册登录的项目,索性我也跟着动手做一个vue项目,引入koa和mongodb,实现客户端(client)提交-服务端(server)接收返回-入数据库全过程. 本项目基于vue-cli搭建,利用token方式进

  • nodejs中Express与Koa2对比分析

    知会上看到有个问题 <Express会被Koa2取代吗?> .刚好对Express.koa有点小研究,于是简单回答了一下. 1.先说结论 目前没有看到Express会被koa2取代的迹象. 目前来说,Express的生态更成熟,入门门槛相对较低.从npm上的下载热度来说,两者的差距还较大,Express的月下载量约为koa2的40倍. 不过koa2的亮点足够吸引人,生态也开始变得完善. 2.从使用门槛来说 从使用上来说,Express对初学者更有好些,对着官网修修改改改就能做点东西出来. ko

  • Koa2 之文件上传下载的示例代码

    前言 上传下载在 web 应用中还是比较常见的,无论是图片还是其他文件等.在 Koa 中,有很多中间件可以帮助我们快速的实现功能. 文件上传 在前端中上传文件,我们都是通过表单来上传,而上传的文件,在服务器端并不能像普通参数一样通过 ctx.request.body 获取.我们可以用 koa-body 中间件来处理文件上传,它可以将请求体拼到 ctx.request 中. // app.js const koa = require('koa'); const app = new koa(); c

  • 详解React项目的服务端渲染改造(koa2+webpack3.11)

    因为对网页SEO的需要,要把之前的React项目改造为服务端渲染,经过一番调查和研究,查阅了大量互联网资料.成功踩坑. 选型思路:实现服务端渲染,想用React最新的版本,并且不对现有的写法做大的改动,如果一开始就打算服务端渲染,建议直接用NEXT框架来写 项目地址:https://github.com/wlx200510/react_koa_ssr 脚手架选型:webpack3.11.0 + react Router4 + Redux + koa2 + React16 + Node8.x 主要

  • jQuery+koa2实现简单的Ajax请求的示例

    前言 之前写Ajax代码只管前端的实现,感觉这样导致自己对Ajax的请求的理解不够深入,所以写了这个从前端到后端的Ajax实现小demo,分别实现简单的GET和POST请求,加深下对前后端交互的理解. 技术栈 koa2 jQuer 需求 某些逻辑可以直接在前端处理,这里发给后端处理是为了更好地理解Ajax请求. POST 通过填写编号和姓名并发送POST请求来保存人员信息,当信息未填写或填写不正确时给出格式错误的提醒:当信息填写正确但编号已存在时给出编号已存在的提醒:当信息填写正确且编号不存在时

  • 理解Koa2中的async&await的用法

    Koa是一款非常著名的Node服务端框架,有1.x版本和2.x版本.前者使用了generator来进行异步操作,后者则用了最新的async/await方案 一开始使用这种写法的时候,我遇到一个问题,代码如下: const Koa = require('koa'); const app = new Koa(); const doSomething = time => { return new Promise(resolve => { setTimeout(() => { resolve('

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

    本文介绍了Node.js的Koa实现JWT用户认证方法,分享给大家,具体如下: 一.前置知识 基于Token的身份验证 Koajs 中文文档 Koa 框架教程 二.环境 Microsoft Visual Studio 2017集成开发环境 Node.js v8.9.4Javascript运行环境 三.开始动手,一步步来完善 1.创建基础的静态资源服务器.基础架构 以下是基本的代码,实现静态服务器,以及一个当token验证异常时候的处理. 下面我们将在这个基本代码下逐步增加注册.登录.信息的功能.

  • python中JWT用户认证的实现

    在前后端分离开发时为什么需要用户认证呢?原因是由于HTTP协定是不储存状态的(stateless),这意味着当我们透过帐号密码验证一个使用者时,当下一个request请求时它就把刚刚的资料忘了.于是我们的程序就不知道谁是谁,就要再验证一次.所以为了保证系统安全,我们就需要验证用户否处于登录状态. 一.传统方式 前后端分离通过Restful API进行数据交互时,如何验证用户的登录信息及权限.在原来的项目中,使用的是最传统也是最简单的方式,前端登录,后端根据用户信息生成一个token,并保存这个t

  • Node.js前后端交互实现用户登陆的实践

    目录 一.项目需求 二,开始撸代码 1,创建前端页面(CSS样式此处省略) 2.Node.js后端获取用户输入数据 最近学习了一点Node.js的后端知识,于是作为一个学习前端方向的我开始了解后端,话不多说,开始介绍.首先,如果你想要更好的理解这篇博客,你需要具备html,css,javascript和Node.js基础以及少许的SQL数据库知识.接下我们开始这个小项目. 一.项目需求 要求用户进入登陆界面,输入用户名和密码后,后端获取用户输入的表单信息,通过从数据库查找,如果正确,跳转登陆成功

  • Node.js刷新session过期时间的实现方法推荐

    在Node.js中,我们通常使用express-session这个包来使用和管理session,保存服务端和客户端浏览器之间的会话状态.那如何才能实现当用户刷新当前页面或者点击页面上的按钮时重新刷新session的过期时间呢?类似于ASP.NET中session会话状态,只要在一定的时间内页面一直保持活动状态,session就不会过期.通过下面的代码可以实现这个功能,我们在Node.js的代码中加入下面的中间件: // use this middleware to reset cookie ex

  • node.js中fs文件系统模块的使用方法实例详解

    本文实例讲述了node.js中fs文件系统模块的使用方法.分享给大家供大家参考,具体如下: node.js中为我们提供了fs文件系统模块,实现对文件或目录的创建,修改和删除等操作. fs模块中,所有的方法分为同步和异步两种实现. 有 sync 后缀的方法为同步方法,没有 sync 后缀的方法为异步方法. 一.文件的整个读取 const fs = require('fs'); //参数一表示读取的文件 //参数二表示读取的配置,{encoding:'null', flag:'r'} //encod

  • 详解Node.js 应用高 CPU 占用率分析方法

    目录 本地运行 Node.js 应用 如何采集生产系统上的 Node.js 应用性能数据 本地运行 Node.js 应用 我们在本地运行 Node.js 应用,使用 --inspect 标志启动应用程序,再次执行负载测试,在 Chrome 浏览器中打开 chrome://inspect: 单击应用下方的 inspect 按钮,然后开始 CPU 占用率分析: 等待一段时间后,就能看到 CPU profile 的结果: 如何采集生产系统上的 Node.js 应用性能数据 在大多数情况下,如果性能问题

  • 快速掌握Node.js中setTimeout和setInterval的使用方法

    Node.js和js一样也有计时器,超时计时器.间隔计时器.及时计时器,它们以及process.nextTick(callback)函数来实现事件调度.今天先学下setTimeout和setInterval的使用. 一.setTimeout超时计时器(和GCD中的after类似) 在node.js中可以使用node.js内置的setTimeout(callback,delayMillSeconds,[args])方法.当调用setTime()时回调函数会在delayMillSeconds后 执行

  • node.js express安装及示例网站搭建方法(分享)

    1.首先肯定是要安装Node.JS windows cmd依次输入如下命令: cd C:\Program Files\nodejs\ npm install -g express npm install -g express-generator 2.创建一个示例工程 windows cmd依次输入如下命令: cd C:\Program Files\nodejs\node_global express -e microblog //即ejs,-j(即jade) cd microblog npm i

  • Node.js批量给图片加水印的方法

    一.准备工作: 首先,你要阅读完这篇文章:http://www.jb51.net/article/97391.htm. 然后,我们安装node.js的一个模块:imageinfo. npm install imageinfo 二.直接上DEMO: 步骤如下: step1:文件夹结构 step2:JS代码 //引用文件系统模块 var fs = require("fs"); //引用imageinfo模块 var imageInfo = require("imageinfo&q

  • Node.JS更改Windows注册表Regedit的方法小结

    注册表是windows操作系统中的一个核心数据库,其中存放着各种参数,直接控制着windows的启动.硬件驱动程序的装载以及一些windows应用程序的运行,从而在整个系统中起着核心作用.这些作用包括了软.硬件的相关配置和状态信息,比如注册表中保存有应用程序和资源管理器外壳的初始条件.首选项和卸载数据等,联网计算机的整个系统的设置和各种许可,文件扩展名与应用程序的关联,硬件部件的描述.状态和属性,性能记录和其他底层的系统状态信息,以及其他数据等. 这里介绍一些通过node.js操作注册表的几种方

随机推荐