在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 相关文章推荐
js定时器怎么写?就是在特定时间执行某段程序
Oct 11 Javascript
两种方法实现在HTML页面加载完毕后运行某个js
Jun 16 Javascript
jQuery实现倒计时按钮功能代码分享
Sep 03 Javascript
巧用Vue.js+Vuex制作专门收藏微信公众号的app
Nov 03 Javascript
JavaScript基础进阶之数组方法总结(推荐)
Sep 04 Javascript
关于vue-cli 3配置打包优化要点(推荐)
Apr 22 Javascript
小程序使用watch监听数据变化的方法详解
Sep 20 Javascript
vue实现配置全局访问路径头(axios)
Nov 01 Javascript
BootstrapValidator验证用户名已存在(ajax)
Nov 08 Javascript
Js和VUE实现跑马灯效果
May 25 Javascript
vue动态设置页面title的方法实例
Aug 23 Javascript
微信小程序实现选项卡滑动切换
Oct 22 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+DBM的同学录程序(4)
2006/10/09 PHP
PHP版微信公众平台红包API
2015/04/02 PHP
php生成带logo二维码方法小结
2016/04/08 PHP
PHP MVC框架skymvc支持多文件上传
2016/05/26 PHP
Yii2.0中使用js异步删除示例
2017/03/10 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
innerHTML 和 getElementsByName 在IE下面的bug 的解决
2010/04/09 Javascript
把input初始值不写value的具体实现方法
2013/07/04 Javascript
JS获取鼠标坐标的实例方法
2013/07/18 Javascript
jQuery.parseJSON(json)将JSON字符串转换成js对象
2014/07/27 Javascript
跟我学习javascript的定时器
2015/11/19 Javascript
深入JavaScript高级程序设计之对象、数组(栈方法,队列方法,重排序方法,迭代方法)
2015/12/01 Javascript
再谈Javascript中的异步以及如何异步
2016/08/19 Javascript
JS实现的自动打字效果示例
2017/03/10 Javascript
jQuery实现 RadioButton做必选校验功能
2017/06/15 jQuery
基于vue.js快速搭建图书管理平台
2017/10/29 Javascript
vue Cli 环境删除与重装教程 - 版本文档
2020/09/11 Javascript
[45:56]Ti4正赛第一天 VG vs NEWBEE 3
2014/07/19 DOTA
[35:34]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python数据分析之如何利用pandas查询数据示例代码
2017/09/01 Python
Python学习_几种存取xls/xlsx文件的方法总结
2018/05/03 Python
python 数字类型和字符串类型的相互转换实例
2018/07/17 Python
Python利用requests模块下载图片实例代码
2019/08/12 Python
python使用itchat模块给心爱的人每天发天气预报
2019/11/25 Python
python实现堆排序的实例讲解
2020/02/21 Python
详解如何用HTML5 Canvas API控制图片的缩放变换
2016/03/22 HTML / CSS
美国电子产品折扣网站:Daily Steals
2017/05/20 全球购物
美国首屈一指的礼品篮供应商:GiftTree
2018/01/06 全球购物
新电JAVA笔试题目
2014/08/31 面试题
函授药学自我鉴定
2014/02/07 职场文书
职位证明模板
2015/06/23 职场文书
小学数学继续教育研修日志
2015/11/13 职场文书
队列队形口号
2015/12/25 职场文书
浅谈Python项目的服务器部署
2021/04/25 Python
MySQL基础快速入门知识总结(附思维导图)
2021/09/25 MySQL
Python四款GUI图形界面库介绍
2022/06/05 Python