在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 相关文章推荐
jquery实现手机发送验证码的倒计时代码
Feb 12 Javascript
Javascript限制网页只能在微信内置浏览器中访问
Nov 09 Javascript
FullCalendar日历插件应用之数据展现(一)
Dec 23 Javascript
vue从使用到源码实现教程详解
Sep 19 Javascript
微信小程序 教程之事件
Oct 18 Javascript
JavaScript基本类型值-Number类型
Feb 24 Javascript
从零开始学习Node.js系列教程之设置HTTP头的方法示例
Apr 13 Javascript
vue-router实现tab标签页(单页面)详解
Oct 17 Javascript
thinkjs微信中控之微信鉴权登陆的实现代码
Aug 08 Javascript
关于vue项目中搜索节流的实现代码
Sep 17 Javascript
JavaScript将数组转换为链表的方法
Feb 16 Javascript
vue 实现基础组件的自动化全局注册
Dec 25 Vue.js
全面了解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/08/08 PHP
在MongoDB中模拟Auto Increment的php代码
2011/03/06 PHP
PHP+mysql实现从数据库获取下拉树功能示例
2017/01/06 PHP
laravel 5.3中自定义加密服务的方案详解
2017/05/09 PHP
如何修改yii2.0自带的user表为其它的表
2017/08/01 PHP
Yii框架ACF(accessController)简单权限控制操作示例
2019/04/26 PHP
json2.js的初步学习与了解
2011/10/06 Javascript
JavaScript 32位整型无符号操作示例
2013/12/08 Javascript
使用Raygun对Node.js应用进行错误处理的方法
2015/06/23 Javascript
纯CSS3代码实现滑动开关效果
2015/08/19 Javascript
IE和Firefox之间在JavaScript语法上的差异
2016/04/22 Javascript
vue.js 获取当前自定义属性值
2017/06/01 Javascript
详解vue 配合vue-resource调用接口获取数据
2017/06/22 Javascript
解决Layui选择全部,换页checkbox复选框重新勾选的问题方法
2018/08/14 Javascript
解决微信小程序防止无法回到主页的问题
2018/09/28 Javascript
vue+vuex+json-seiver实现数据展示+分页功能
2019/04/11 Javascript
微信小程序JS加载esmap地图的实例详解
2019/09/04 Javascript
layer.open提交子页面的form和layedit文本编辑内容的方法
2019/09/27 Javascript
javascript(基于jQuery)实现鼠标获取选中的文字示例【测试可用】
2019/10/26 jQuery
vue addRoutes路由动态加载操作
2020/08/04 Javascript
Python 迭代器工具包【推荐】
2016/05/06 Python
详解Python利用random生成一个列表内的随机数
2019/08/21 Python
Python封装成可带参数的EXE安装包实例
2019/08/24 Python
python实现信号时域统计特征提取代码
2020/02/26 Python
python sitk.show()与imageJ结合使用常见的问题
2020/04/20 Python
python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门)
2021/02/19 Python
在css3中background-clip属性与background-origin属性的用法介绍
2012/11/13 HTML / CSS
香港永安旅游网:Wing On Travel
2017/04/10 全球购物
Otticanet意大利:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/03/10 全球购物
计算机通信专业推荐信
2014/02/22 职场文书
文明生主要事迹
2014/05/25 职场文书
销售行政专员岗位职责
2014/06/10 职场文书
在职员工证明书
2014/09/19 职场文书
2014年挂职干部工作总结
2014/12/06 职场文书
离婚财产分割协议书
2015/08/11 职场文书
解析redis hash应用场景和常用命令
2021/08/04 Redis