在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 相关文章推荐
firefox下对ajax的onreadystatechange的支持情况分析
Dec 14 Javascript
jquery nth-child()选择器的简单应用
Jul 10 Javascript
addEventListener()第三个参数useCapture (Boolean)详细解析
Nov 07 Javascript
js操作table示例(个人心得)
Nov 29 Javascript
node.js中的fs.open方法使用说明
Dec 17 Javascript
JavaScript实现鼠标滑过处生成气泡的方法
May 16 Javascript
js实现HashTable(哈希表)的实例分析
Nov 21 Javascript
不到200行 JavaScript 代码实现富文本编辑器的方法
Jan 03 Javascript
React Native使用fetch实现图片上传的示例代码
Mar 07 Javascript
Vuex中实现数据状态查询与更改
Nov 08 Javascript
微信小程序基于高德地图API实现天气组件(动态效果)
Oct 22 Javascript
如何用JavaScipt测网速
May 09 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
五款常用mysql slow log分析工具的比较分析
2011/05/22 PHP
php输出xml必须header的解决方法
2014/10/17 PHP
jquery+php实现导出datatables插件数据到excel的方法
2015/07/06 PHP
PHP设计模式之建造者模式定义与用法简单示例
2018/08/13 PHP
Laravel源码解析之路由的使用和示例详解
2018/09/27 PHP
jquery ui resizable bug解决方法
2010/10/26 Javascript
再说AutoComplete自动补全之实现原理
2011/11/05 Javascript
自定义ExtJS控件之下拉树和下拉表格附源码
2013/10/15 Javascript
js数组的基本用法及数组根据下标(数值或字符)移除元素
2013/10/20 Javascript
javascript判断css3动画结束 css3动画结束的回调函数
2015/03/10 Javascript
AngularJS中的过滤器使用详解
2015/06/16 Javascript
EasyUI在表单提交之前进行验证的实例代码
2016/06/24 Javascript
JavaScript实现窗口抖动效果
2016/10/19 Javascript
整理一下常见的IE错误
2016/11/18 Javascript
AngularJs中Bootstrap3 datetimepicker使用实例
2016/12/13 Javascript
Vue.JS项目中5个经典Vuex插件
2017/11/28 Javascript
VUE基于NUXT的SSR 服务端渲染
2018/11/30 Javascript
深入探讨JavaScript的最基本部分之执行上下文
2019/02/12 Javascript
[05:04]完美世界携手游戏风云打造 卡尔工作室地图界面篇
2013/04/23 DOTA
[02:14]DOTA2英雄基础教程 修补匠
2013/12/23 DOTA
Python使用Socket(Https)Post登录百度的实现代码
2012/05/18 Python
Python程序中使用SQLAlchemy时出现乱码的解决方案
2015/04/24 Python
python使用pandas实现数据分割实例代码
2018/01/25 Python
搞清楚 Python traceback的具体使用方法
2019/05/13 Python
Python循环中else,break和continue的用法实例详解
2019/07/11 Python
Python二维数组实现求出3*3矩阵对角线元素的和示例
2019/11/29 Python
Pytorch 高效使用GPU的操作
2020/06/27 Python
css3如何绘制一个圆圆的loading转圈动画
2018/01/09 HTML / CSS
香港No.1得奖零食网:香港零食大王
2016/07/22 全球购物
来自世界各地的优质葡萄酒:VineShop24
2018/07/09 全球购物
电子狗项圈:eDog Australia
2019/12/04 全球购物
mysql_pconnect()和mysql_connect()有什么区别
2012/05/25 面试题
DBA的职责都有哪些
2012/05/16 面试题
土地租赁意向书
2014/07/30 职场文书
2014年为民办实事工作总结
2014/12/20 职场文书
2015年科协工作总结
2015/05/19 职场文书