在node中使用jwt签发与验证token的方法


Posted in Javascript onApril 03, 2019

1.什么是token

token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。

token是在服务端产生的。如果前端使用用户名和密码向服务端发送请求认证,服务端认证成功,那么在服务端会返回token给前端。

前端可以在每次请求的时候带上token证明自己的合法地位。如果token在服务端持久化,那他就是一个永久的身份令牌。

2.什么是jwt

jwt,即JSON Web Token的缩写,是一个开放标准(RFC 7519),它定义了一种紧凑且独立的方式,用于在各方之间作为JSON对象安全地传输信息。

jwt由三个部分组成,它们之间用.分开,通常如下所示xxxxx.yyyyy.zzzzz,

第一个部分为Header,由两部分组成,类型和算法,例如

{
 "alg": "HS256", // 算法
 "typ": "JWT" // 类型
}

第二个部分为Payload,用来存放实际需要传递的数据。JWT 规定了7个官方字段,供选用。例如:

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

除了官方字段,你还可以在这个部分定义私有字段,下面就是一个例子。

{
 "sub": "1234567890",
 "name": "John Doe",
 "admin": true
}

请注意,对于token,此信息虽然可以防止被篡改,但任何人都可以读取。除非加密,否则不要将秘密信息放在JWT的Payload或Header元素中。

第三部分为Signature,Signature 部分是对前两部分的签名,防止数据篡改。

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

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

算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户。

3.使用node签发token

首先需要下载jwt的依赖包

npm install jsonwebtoken

然后在文件中使用

var jwt = require('jsonwebtoken')
const payload = {
   name: 'boom'
  }
const secret = 'JQREAD'
const token = jwt.sign(payload, secret) // 签发
console.log(token)

jwt.sign(payload, secret) 就可以签发token了,然后返回给前端,前端将返回的token保存在localstorage里或sessionstorage里

4.使用node验证token

在用户完成登录获得token并保存后,此后每次请求后台把token放在请求头中,例如:

const guestToken = getStorage('token')
 if (guestToken) {
  config.headers['X-GuestToken'] = guestToken
 }

然后再后台验证token

var token = req.headers['x-guesttoken']
const secret = 'JQREAD' // secret要与签发时一致
jwt.verify(token, secret, (err, decoded) => {
  if(err){
   console.log(err)
   return
  }
  console.log(decoded)
}

验证失败会打印出 Invalid Signature

验证成功会打印签发时的payload数据,然后就可以继续进行操作,返回数据了。

总结

以上所述是小编给大家介绍的在node中使用jwt签发与验证token的方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
javascript学习基础笔记之DOM对象操作
Nov 03 Javascript
Js 冒泡事件阻止实现代码
Jan 27 Javascript
基于JavaScript实现图片点击弹出窗口而不是保存
Feb 06 Javascript
AngularJS API之copy深拷贝详解及实例
Sep 14 Javascript
react+redux的升级版todoList的实现
Dec 18 Javascript
webpack 3.X学习之多页面打包的方法
Sep 04 Javascript
解决Vue中引入swiper,在数据渲染的时候,发生不滑动的问题
Sep 27 Javascript
vue-cli2 构建速度优化的实现方法
Jan 08 Javascript
javascript实现简单打字游戏
Oct 29 Javascript
element-ui中按需引入的实现
Dec 25 Javascript
在 Vue 中使用 JSX 及使用它的原因浅析
Feb 10 Javascript
Javascript异步流程控制之串行执行详解
Sep 27 Javascript
全面了解JavaScript的作用域链
Apr 03 #Javascript
从理论角度讨论JavaScript闭包
Apr 03 #Javascript
Node.js+Express+Mysql 实现增删改查
Apr 03 #Javascript
微信小程序配置服务器提示验证token失败的解决方法
Apr 03 #Javascript
js前端面试之同步与异步问题详解
Apr 03 #Javascript
详解JavaScript 为什么要有 Symbol 类型?
Apr 03 #Javascript
es6 filter() 数组过滤方法总结
Apr 03 #Javascript
You might like
PHP获取网页所有连接的方法(附demo源码下载)
2016/03/30 PHP
php实现购物车产品删除功能(2)
2020/07/23 PHP
Nginx下ThinkPHP5的配置方法详解
2017/08/01 PHP
PHP数组array类常见操作示例
2020/05/15 PHP
基于JQuery的密码强度验证代码
2010/03/01 Javascript
jquery 注意事项与常用语法小结
2010/06/07 Javascript
JavaScript之HTMLCollection接口代码
2011/04/27 Javascript
jQuery学习笔记(3)--用jquery(插件)实现多选项卡功能
2013/04/08 Javascript
jquery统计用户选中的复选框的个数
2014/06/06 Javascript
js图片实时加载提供网页打开速度
2014/09/11 Javascript
使用百度地图api实现根据地址查询经纬度
2014/12/11 Javascript
js利用appendChild对标签进行排序的实现方法
2016/10/16 Javascript
bootstrap table 数据表格行内修改的实现代码
2017/02/13 Javascript
jQuery插件FusionCharts绘制的2D双面积图效果示例【附demo源码】
2017/04/11 jQuery
Bootstrap table学习笔记(2) 前后端分页模糊查询
2017/05/18 Javascript
详解为Bootstrap Modal添加拖拽的方法
2018/01/05 Javascript
基于vue.js无缝滚动效果
2018/01/25 Javascript
微信小程序在线客服自动回复功能(基于node)
2019/07/03 Javascript
Vue 开发必须知道的36个技巧(小结)
2019/10/09 Javascript
javascript实现弹出层效果
2019/12/10 Javascript
python matplotlib坐标轴设置的方法
2017/12/05 Python
python如何定义带参数的装饰器
2018/03/20 Python
python数字图像处理之高级形态学处理
2018/04/27 Python
python自定义函数实现一个数的三次方计算方法
2019/01/20 Python
python3.7简单的爬虫实例详解
2019/07/08 Python
详解Python中list[::-1]的几种用法
2020/11/16 Python
用html5绘制折线图的实例代码
2016/03/25 HTML / CSS
canvas 实现 github404动态效果的示例代码
2017/11/15 HTML / CSS
Lyle & Scott苏格兰金鹰官网:英国皇室御用品牌
2018/05/09 全球购物
某同学的自我鉴定范文
2013/12/26 职场文书
质量承诺书怎么写
2014/05/24 职场文书
小学安全工作总结2015
2015/05/18 职场文书
实习单位意见
2015/06/04 职场文书
Python pandas之求和运算和非空值个数统计
2021/08/07 Python
Python函数式编程中itertools模块详解
2021/09/15 Python
Python干货实战之八音符酱小游戏全过程详解
2021/10/24 Python