在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 相关文章推荐
使用dynatrace-ajax跟踪JavaScript的性能
Apr 12 Javascript
java与javascript之间json格式数据互转介绍
Oct 29 Javascript
在JavaScript中处理字符串之link()方法的使用
Jun 08 Javascript
js 实现获取name 相同的页面元素并循环遍历的方法
Feb 14 Javascript
JS正则表达式判断有效数实例代码
Mar 13 Javascript
基于JavaScript实现数码时钟效果
Mar 30 Javascript
vue-cli中的babel配置文件.babelrc实例详解
Feb 22 Javascript
bootstrap里bootstrap动态加载下拉框的实例讲解
Aug 10 Javascript
angularJS实现不同视图同步刷新详解
Oct 09 Javascript
微信小程序ibeacon三点定位详解
Oct 31 Javascript
浅析VUE防抖与节流
Nov 24 Vue.js
JS数组去重详情
Nov 07 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伪静态写法附代码
2008/06/20 PHP
PHP变量内存分配问题记录整理
2013/11/27 PHP
php中mysql操作buffer用法详解
2015/03/19 PHP
PHP实现将base64编码字符串转换成图片示例
2018/06/22 PHP
PHP常见字符串操作函数与用法总结
2019/03/04 PHP
在textarea中屏蔽js的某个function的javascript代码
2007/04/20 Javascript
Jquery 学习笔记(一)
2009/10/13 Javascript
jQuery $.data()方法使用注意细节
2012/12/31 Javascript
jquery数组过滤筛选方法grep()简介
2014/06/06 Javascript
form.submit()不能提交表单的错误原因及解决方法
2014/10/13 Javascript
js点击选择文本的方法
2015/02/09 Javascript
javascript巧用eval函数组装表单输入项为json对象的方法
2015/11/25 Javascript
AngularJS服务service用法总结
2016/12/13 Javascript
jQuery animate()实现背景色渐变效果的处理方法【使用jQuery.color.js插件】
2017/03/15 Javascript
详解从angular-cli:1.0.0-beta.28.3升级到@angular/cli:1.0.0
2017/05/22 Javascript
详解webpack+vue-cli项目打包技巧
2017/06/17 Javascript
vue 做移动端微信公众号采坑经验记录
2018/04/26 Javascript
微信小程序学习总结(四)事件与冒泡实例分析
2020/06/04 Javascript
Python写一个基于MD5的文件监听程序
2019/03/11 Python
将pip源更换到国内镜像的详细步骤
2019/04/07 Python
Django结合ajax进行页面实时更新的例子
2019/08/12 Python
Python hashlib加密模块常用方法解析
2019/12/18 Python
基于python实现文件加密功能
2020/01/06 Python
浅谈pytorch池化maxpool2D注意事项
2020/02/18 Python
python 装饰器功能与用法案例详解
2020/03/06 Python
django从后台返回html代码的实例
2020/03/11 Python
python 日志模块 日志等级设置失效的解决方案
2020/05/26 Python
python脚本使用阿里云slb对恶意攻击进行封堵的实现
2021/02/04 Python
如何利用find命令查找文件
2016/11/18 面试题
地理科学专业毕业生求职信
2013/10/15 职场文书
《乌鸦和狐狸》教学反思
2014/02/08 职场文书
西柏坡导游词
2015/02/05 职场文书
只需要12页,掌握撰写一流商业计划书的技巧
2019/05/07 职场文书
导游词幽默开场白
2019/06/26 职场文书
PyQt5爬取12306车票信息程序的实现
2021/05/14 Python
java开发双人五子棋游戏
2022/05/06 Java/Android