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 相关文章推荐
拉动滚动条加载数据的jquery代码
May 03 Javascript
Javascript 页面模板化很多人没有使用过的方法
Jun 05 Javascript
JS检测图片大小的实例
Aug 21 Javascript
jquery div拖动效果示例代码
Dec 08 Javascript
JavaScript使用pop方法移除数组最后一个元素用法实例
Apr 06 Javascript
Javascript HTML5 Canvas实现的一个画板
Apr 12 Javascript
通过一次报错详细谈谈Point事件
May 17 Javascript
Angular设置别名alias的方法
Nov 08 Javascript
如何优雅地在vue中添加权限控制示例详解
Mar 07 Javascript
利用weixin-java-miniapp生成小程序码并直接返回图片文件流的方法
Mar 29 Javascript
通过微信公众平台获取公众号文章的方法示例
Dec 25 Javascript
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
Oct 09 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
快速配置PHPMyAdmin方法
2008/06/05 PHP
超级实用的7个PHP代码片段分享
2012/01/05 PHP
解析VS2010利用VS.PHP插件调试PHP的方法
2013/07/19 PHP
php通过字符串调用函数示例
2014/03/02 PHP
php隐藏IP地址后两位显示为星号的方法
2014/11/21 PHP
在Nginx上部署ThinkPHP项目教程
2015/02/02 PHP
PHP 返回13位时间戳的实现代码
2016/05/13 PHP
PHP中的多种加密技术及代码示例解析
2016/10/20 PHP
PHP开发之用微信远程遥控服务器
2018/01/25 PHP
PHP 数组操作详解【遍历、指针、函数等】
2020/05/13 PHP
php生成短网址/短链接原理和用法实例分析
2020/05/29 PHP
CheckBox 如何实现全选?
2006/06/23 Javascript
js技巧--转义符"\"的妙用
2007/01/09 Javascript
jquery动画3.创建一个带遮罩效果的图片走廊
2012/08/24 Javascript
Nodejs Post请求报socket hang up错误的解决办法
2014/09/25 NodeJs
详解JavaScript中Date.UTC()方法的使用
2015/06/12 Javascript
JavaScript与HTML的结合方法详解
2015/11/23 Javascript
浅谈js对象属性 通过点(.) 和方括号([]) 的不同之处
2016/10/29 Javascript
jQuery 选择符详细介绍及整理
2016/12/02 Javascript
完美解决JS文件页面加载时的阻塞问题
2016/12/18 Javascript
微信小程序实现卡片左右滑动效果的示例代码
2019/05/01 Javascript
详解使用pymysql在python中对mysql的增删改查操作(综合)
2017/01/18 Python
详解Django中六个常用的自定义装饰器
2018/07/04 Python
Anaconda下配置python+opencv+contribx的实例讲解
2018/08/06 Python
使用python获取邮箱邮件的设置方法
2019/09/20 Python
韩国知名的家庭购物网站:CJmall
2016/08/01 全球购物
ziaja齐叶雅官方海外旗舰店:来自波兰的天然护肤品牌
2017/01/02 全球购物
美国知名奢侈美容品牌零售商:Cos Bar
2017/04/21 全球购物
Pop In A Box英国:Funko POP搪胶公仔
2019/05/27 全球购物
毕业生求职推荐信
2013/11/04 职场文书
批评与自我批评材料
2014/02/15 职场文书
老同学聚会感言
2014/02/23 职场文书
《孔繁森》教学反思
2014/04/17 职场文书
高中竞选班长演讲稿
2014/04/24 职场文书
妇联领导班子剖析材料
2014/08/21 职场文书
党员带头倡议书
2015/04/29 职场文书