在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魔力之$("tagName")与selector
Mar 05 Javascript
document.all的一个比较完整的总结及案例
Jan 31 Javascript
jQuery层次选择器选择元素使用介绍
Apr 18 Javascript
jquery使用$(element).is()来判断获取的tagName
Aug 24 Javascript
JavaScript中使用Object.prototype.toString判断是否为数组
Apr 01 Javascript
Bootstrap CSS组件之面包屑导航(breadcrumb)
Dec 17 Javascript
jQuery实现两列等高并自适应高度
Dec 22 Javascript
JS中的Replace()传入函数时的用法详解
Sep 11 Javascript
Angular弹出模态框的两种方式
Oct 19 Javascript
JS中的算法与数据结构之字典(Dictionary)实例详解
Aug 20 Javascript
微信小程序如何实现点击图片放大功能
Jan 21 Javascript
详解js创建对象的几种方式和对象方法
Mar 01 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 has encountered an Access Violation
2007/01/15 PHP
ThinkPHP3.1查询语言详解
2014/06/19 PHP
Code: write(s,d) 输出连续字符串
2007/08/19 Javascript
通过百度地图获取公交线路的站点坐标的js代码
2012/05/11 Javascript
javascript中的onkeyup和onkeydown区别介绍
2013/04/28 Javascript
扩展js对象数组的OrderByAsc和OrderByDesc方法实现思路
2013/05/17 Javascript
JS中三目运算符和if else的区别分析与示例
2014/11/21 Javascript
JS实现在页面随时自定义背景颜色的方法
2015/02/27 Javascript
jquery实现很酷的网页顶部图标下拉菜单效果
2015/08/22 Javascript
浅析Node.js 中 Stream API 的使用
2015/10/23 Javascript
JS作用域深度解析
2016/12/29 Javascript
JavaScript中的this陷阱的最全收集并整理(没有之一)
2017/02/21 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
JS中Safari浏览器中的Date
2017/07/17 Javascript
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
2017/09/18 NodeJs
五步轻松实现zTree的使用
2017/11/01 Javascript
vue双花括号的使用方法 附练习题
2017/11/07 Javascript
vue2.x+webpack快速搭建前端项目框架详解
2017/11/30 Javascript
Vue中函数防抖节流的理解及应用实现
2020/04/24 Javascript
[01:16:16]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第二场 1月8日
2021/03/11 DOTA
[07:25]DOTA2-DPC中国联赛2月5日Recap集锦
2021/03/11 DOTA
Python中的二叉树查找算法模块使用指南
2014/07/04 Python
200行自定义python异步非阻塞Web框架
2017/03/15 Python
Python基于递归算法实现的走迷宫问题
2017/08/04 Python
python实现图片文件批量重命名
2020/03/23 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
2019/01/22 Python
搞定这套Python爬虫面试题(面试会so easy)
2019/04/03 Python
PyQt5 QListWidget选择多项并返回的实例
2019/06/17 Python
对django中foreignkey的简单使用详解
2019/07/28 Python
PyQt5使用QTimer实现电子时钟
2019/07/29 Python
pytorch nn.Conv2d()中的padding以及输出大小方式
2020/01/10 Python
python实现连连看游戏
2020/02/14 Python
PyCharm配置anaconda环境的步骤详解
2020/07/31 Python
应聘护理专业毕业自荐书范文
2014/02/12 职场文书
党的群众路线教育学习材料
2014/05/12 职场文书
赵乐秦在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书