在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学习笔记(九)javascript中的原型(prototype)及原型链的继承方式
Apr 12 Javascript
用js实现判断当前网址的来路如果不是指定的来路就跳转到指定页面
May 02 Javascript
Javascript base64编码实现代码
Dec 02 Javascript
纯js分页代码(简洁实用)
Nov 05 Javascript
鼠标移入移出事件改变图片的分辨率的两种方法
Dec 17 Javascript
jQuery 翻页组件yunm.pager.js实现div局部刷新的思路
Aug 11 Javascript
vue中v-for加载本地静态图片方法
Mar 03 Javascript
Vue.js结合bootstrap前端实现分页和排序效果
Dec 29 Javascript
vue中的双向数据绑定原理与常见操作技巧详解
Mar 16 Javascript
微信小程序实现菜单左右联动
May 19 Javascript
VueJS实现用户管理系统
May 29 Javascript
JS实现多选框的操作
Jun 24 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无敌近乎加密方式!
2010/07/17 PHP
php实现姓名根据首字母排序的类与方法(实例代码)
2018/05/16 PHP
jquery ui dialog里调用datepicker的问题
2009/08/06 Javascript
javascript操作cookie的文章(设置,删除cookies)
2010/04/01 Javascript
javascript函数以及基础写法100多条实用整理
2013/01/13 Javascript
使用jQuery UI的tooltip函数修饰title属性的气泡悬浮框
2013/06/24 Javascript
浅谈checkbox的一些操作(实战经验)
2013/11/20 Javascript
jQuery中阻止冒泡事件的方法介绍
2014/04/12 Javascript
使用JSON.parse将json字符串转换成json对象的时候会出错
2014/09/04 Javascript
jQuery实现带有动画效果的回到顶部和底部代码
2015/11/04 Javascript
BootStrap智能表单实战系列(六)表单编辑页面的数据绑定
2016/06/13 Javascript
jquery根据td给相同tr下其他td赋值的实现方法
2016/10/05 Javascript
Jquery on绑定的事件 触发多次实例代码
2016/12/08 Javascript
angularJS模态框$modal实例代码
2017/05/27 Javascript
Bootstrap table使用方法记录
2017/08/23 Javascript
浅谈React Native Flexbox布局(小结)
2018/01/08 Javascript
JS中的JSON对象的定义和取值实现代码
2018/05/09 Javascript
微信小程序 Animation实现图片旋转动画示例
2018/08/22 Javascript
详解mpvue小程序中怎么引入iconfont字体图标
2018/10/01 Javascript
ES6 对象的新功能与解构赋值介绍
2019/02/05 Javascript
js实现页面图片消除效果
2020/03/24 Javascript
javascript实现点击按钮切换轮播图功能
2020/09/23 Javascript
初步介绍Python中的pydoc模块和distutils模块
2015/04/13 Python
Python测试人员需要掌握的知识
2018/02/08 Python
在python中使用xlrd获取合并单元格的方法
2018/12/26 Python
Python 获取ftp服务器文件时间的方法
2019/07/02 Python
python中必要的名词解释
2019/11/20 Python
pycharm实现在虚拟环境中引入别人的项目
2020/03/09 Python
matplotlib grid()设置网格线外观的实现
2021/02/22 Python
HTML5添加禁止缩放功能
2017/11/03 HTML / CSS
银行见习期自我鉴定
2014/01/29 职场文书
高级工程师英文求职信
2014/03/19 职场文书
安全生产专项整治方案
2014/05/06 职场文书
2015年大学团支部工作总结
2015/05/13 职场文书
windows11怎么查看自己安装的版本号? win11版本号的查看方法
2021/11/21 数码科技
Python列表的索引与切片
2022/04/07 Python