在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 相关文章推荐
HTML中事件触发列表与解说
Jul 09 Javascript
Mootools 1.2教程(21)——类(二)
Sep 15 Javascript
简略的前端架构心得&&基于editor为例子的编码小技巧
Nov 25 Javascript
基于jQuery实现的当离开页面时出现提示的实现代码
Jun 27 Javascript
背景图跟随鼠标移动的Mootools插件实现代码
Dec 12 Javascript
JavaScript操作XML 使用百度RSS作为新闻源示例
Feb 17 Javascript
jquery隐藏标签和显示标签的实例
Nov 11 Javascript
js实现时间显示几天前、几小时前或者几分钟前的方法集锦
May 29 Javascript
jquery append与appendTo方法比较
May 24 jQuery
原生JS与jQuery编写简单选项卡
Oct 30 jQuery
vue源码解析之事件机制原理
Apr 21 Javascript
使用vue-router切换页面时实现设置过渡动画
Oct 31 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
PHP7.0版本备注
2015/07/23 PHP
PHP提高编程效率的20个要点
2015/09/23 PHP
php 删除一维数组中某一个值元素的操作方法
2018/02/01 PHP
JavaScript 判断指定字符串是否为有效数字
2010/05/11 Javascript
js 自定义个性下拉选择框示例
2013/08/20 Javascript
CSS3实现动态背景登录框的代码
2015/07/28 Javascript
JQuery 的跨域方法推荐_可跨任何网站
2016/05/18 Javascript
jQuery+Ajax实现限制查询间隔的方法
2016/06/07 Javascript
js验证框架之RealyEasy验证详解
2016/06/08 Javascript
学习 NodeJS 第八天:Socket 通讯实例
2016/12/21 NodeJs
微信小程序 wx.login解密出现乱码的问题解决办法
2017/03/10 Javascript
老生常谈jacascript DOM节点获取
2017/04/17 Javascript
基于Datatables跳转到指定页的简单实例
2017/11/09 Javascript
vue实现验证码按钮倒计时功能
2018/04/10 Javascript
从组件封装看Vue的作用域插槽的实现
2019/02/12 Javascript
jquery实现的分页显示功能示例
2019/08/23 jQuery
Vue路由之JWT身份认证的实现方法
2019/08/26 Javascript
JavaScript修改注册表实例代码
2020/01/05 Javascript
vue项目中使用particles实现粒子背景效果及遇到的坑(按钮没有点击响应)
2020/02/11 Javascript
[01:04]DOTA2上海特锦赛现场采访 FreeAgain遭众解说围攻
2016/03/25 DOTA
[30:55]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第二场 11.18
2020/11/18 DOTA
用Python计算三角函数之atan()方法的使用
2015/05/15 Python
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
2015/05/22 Python
安装Python的教程-Windows
2017/07/22 Python
python中装饰器级连的使用方法示例
2017/09/29 Python
Python3.4学习笔记之类型判断,异常处理,终止程序操作小结
2019/03/01 Python
用vue.js组件模拟v-model指令实例方法
2019/07/05 Python
python列表每个元素同增同减和列表元素去空格的实例
2019/07/20 Python
Python动态声明变量赋值代码实例
2019/12/30 Python
python使用正则表达式(Regular Expression)方法超详细
2019/12/30 Python
python安装dlib库报错问题及解决方法
2020/03/16 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
2020/07/03 Python
世界排名第一的运动鞋市场:Flight Club
2020/01/03 全球购物
马丁路德金演讲稿
2014/05/19 职场文书
纪念九一八事变演讲稿:牢记九一八,屈辱怎能忘
2014/09/14 职场文书
文艺委员竞选稿
2015/11/19 职场文书