Node使用koa2实现一个简单JWT鉴权的方法


Posted in Javascript onJanuary 26, 2021

JWT 简介

什么是 JWT

全称 JSON Web Token , 是目前最流行的跨域认证解决方案。基本的实现是服务端认证后,生成一个 JSON 对象,发回给用户。用户与服务端通信的时候,都要发回这个 JSON 对象。

JSON 类似如下:

{
 "姓名": "张三",
 "角色": "管理员",
 "到期时间": "2018年7月1日0点0分"
}

为什么需要 JWT

先看下一般的认证流程,基于 session_idCookie 实现

1、用户向服务器发送用户名和密码。

2、服务器验证通过后,在当前对话( session )里面保存相关数据,比如用户角色、登录时间等等。

3、服务器向用户返回一个 session_id ,写入用户的 Cookie

4、用户随后的每一次请求,都会通过 Cookie ,将 session_id 传回服务器。

5、服务器收到 session_id ,找到前期保存的数据,由此得知用户的身份。

但是这里有一个大的问题, 假如是服务器集群,则要求 session 数据共享,每台服务器都能够读取 session 。这个实现成本是比较大的。

JWT 转换了思路,将 JSON 数据返回给前端的,前端再次请求时候将数据发送到后端,后端进行验证。也就是服务器是无状态的,所以更加容易拓展。

JWT 的数据结构

JWT 的三个部分依次如下:

Header (头部),类似如下

{
 "alg": "HS256",
 "typ": "JWT"
}

alg 属性表示签名的算法( algorithm ),默认是 HMAC SHA256 (写成 HS256 )。 typ 属性表示这个令牌( token )的类型( type ), JWT 令牌统一写为 JWT

Payload (负载)。也是一个 JSON ,用来存放实际需要传递的数据。 JWT 规定了 7 个官方字段。如下所示

  • iss (issuer):签发人
  • exp (expiration time):过期时间
  • sub (subject):主题
  • aud (audience):受众
  • nbf (Not Before):生效时间
  • iat (Issued At):签发时间
  • jti (JWT ID):编号

当然也可以自定义私有字段。 但是要注意,JWT 默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分。

Signature (签名)。 Signature 部分是对前两部分的签名,防止数据篡改。首先,需要指定一个密钥( secret )。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256 ),按照下面的公式产生签名。

HMACSHA256(
 base64UrlEncode(header) + "." +
 base64UrlEncode(payload),
 secret)

算出签名以后,把 HeaderPayloadSignature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户。如下所示

Node使用koa2实现一个简单JWT鉴权的方法

JWT 的安全

  • JWT 默认是不加密,但也是可以加密的。 JWT 不加密的情况下,不能将秘密数据写入 JWT
  • JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用, JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证
  • 为了减少盗用, JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输

Node 简单demo—— Koa JWT 的实现

说完理论知识,我们来看下如何实现 JWT ,大致的流程如下:

Node使用koa2实现一个简单JWT鉴权的方法

首先,用户登录后服务端根据用户信息生成并返回 token 给到客户端,前端在下次请求中把 token 带给服务器,服务器验证有效后,返回数据。无效的话,返回 401 状态码

这里我们用 Node 实现,主要用到的两个库有

Node.js 应用:Koa2 使用 JWT 进行鉴权

到此这篇关于Node使用koa2实现一个简单JWT鉴权的方法的文章就介绍到这了,更多相关Node koa2 JWT鉴权内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
javascript判断单选框或复选框是否选中方法集锦
Apr 04 Javascript
javascript document.images实例
May 27 Javascript
js获取单元格自定义属性值的代码(IE/Firefox)
Apr 05 Javascript
借助script进行Http跨域请求:JSONP实现原理及代码
Mar 19 Javascript
jQuery实现可收缩展开的级联菜单实例代码
Nov 27 Javascript
JavaScript中数据结构与算法(四):串(BF)
Jun 19 Javascript
jquery+css3实现会动的小圆圈效果
Jan 27 Javascript
常用原生js自定义函数总结
Nov 20 Javascript
BootStrap学习系列之布局组件(下拉,按钮组[toolbar],上拉)
Jan 03 Javascript
js+html5 canvas实现ps钢笔抠图
Apr 28 Javascript
Vue解析剪切板图片并实现发送功能
Feb 04 Javascript
js 解析 JSON 数据简单示例
Apr 21 Javascript
vue3 watch和watchEffect的使用以及有哪些区别
Jan 26 #Vue.js
vue实现轮播图帧率播放
Jan 26 #Vue.js
vue 组件基础知识总结
Jan 26 #Vue.js
深入了解Vue动态组件和异步组件
Jan 26 #Vue.js
如何在 Vue 表单中处理图片
Jan 26 #Vue.js
Vue实现摇一摇功能(兼容ios13.3以上)
Jan 26 #Vue.js
原生js实现九宫格拖拽换位
Jan 26 #Javascript
You might like
dedecms中常见问题修改方法总结
2007/03/21 PHP
IIS php环境配置PHP5 MySQL5 ZendOptimizer phpmyadmin安装与配置
2008/11/18 PHP
PHP中使用CURL伪造来路抓取页面或文件
2011/05/04 PHP
php最简单的删除目录与文件实现方法
2014/11/28 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
2019/11/19 PHP
JQuery this 和 $(this) 的区别
2009/08/23 Javascript
jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
2014/01/08 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
2014/10/17 Javascript
如何在MVC应用程序中使用Jquery
2014/11/17 Javascript
jquery插件unobtrusive实现片段式加载
2015/06/15 Javascript
详解js中构造流程图的核心技术JsPlumb
2015/12/08 Javascript
JavaScript生成带有缩进的表格代码
2016/06/15 Javascript
Js删除数组中某一项或几项的几种方法(推荐)
2016/07/27 Javascript
利用node.js写一个爬取知乎妹纸图的小爬虫
2017/05/03 Javascript
Vue 父子组件数据传递的四种方式( inheritAttrs + $attrs + $listeners)
2018/05/04 Javascript
JavaScript实现仿Clock ISO时钟
2018/06/29 Javascript
详解关于element el-button使用$attrs的一个注意要点
2018/11/09 Javascript
微信小程序实现搜索框功能及踩过的坑
2020/06/19 Javascript
node.js爬虫框架node-crawler初体验
2020/10/29 Javascript
vant-ui AddressEdit地址编辑和van-area的用法说明
2020/11/03 Javascript
JS实现手风琴特效
2020/11/08 Javascript
python3抓取中文网页的方法
2015/07/28 Python
Python2实现的LED大数字显示效果示例
2017/09/04 Python
Python3中的列表生成式、生成器与迭代器实例详解
2018/06/11 Python
使用Template格式化Python字符串的方法
2019/01/22 Python
python脚本调用iftop 统计业务应用流量的思路详解
2019/10/11 Python
一款基于css3的列表toggle特效实例教程
2015/01/04 HTML / CSS
伦敦一家非常流行的时尚精品店:Oxygen Boutique
2017/01/15 全球购物
英国鞋网:Rubber Sole
2020/03/03 全球购物
Abbott Lyon官网:女士手表、珠宝及配件
2020/12/26 全球购物
我看到了用指针调用函数的不同语法形式
2014/07/16 面试题
项目建议书范文
2014/05/12 职场文书
微笑服务标语
2014/06/24 职场文书
离婚协议书样本
2015/01/26 职场文书
幼儿园毕业典礼家长致辞
2015/07/29 职场文书
Linux中一对多配置日志服务器的详细步骤
2022/07/23 Servers