在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 相关文章推荐
学习ExtJS accordion布局
Oct 08 Javascript
json 实例详细说明教程
Oct 31 Javascript
Riot.js 快速的JavaScript单元测试框架
Nov 09 Javascript
再论Javascript下字符串连接的性能
Mar 05 Javascript
JS获取页面input控件中所有text控件并追加样式属性
Feb 25 Javascript
JQuery实现防止退格键返回的方法
Feb 12 Javascript
Seajs是什么及sea.js 由来,特点以及优势
Oct 13 Javascript
详谈Ajax请求中的async:false/true的作用(ajax 在外部调用问题)
Feb 10 Javascript
基于VUE选择上传图片并页面显示(图片可删除)
May 25 Javascript
一个简易时钟效果js实现代码
Mar 25 Javascript
webpack-dev-server远程访问配置方法
Feb 22 Javascript
js尾调用优化的实现
May 23 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文件怎么打开 如何执行php文件
2011/12/21 PHP
PHP内核探索之解释器的执行过程
2015/12/22 PHP
tp5.1框架数据库子查询操作实例分析
2020/05/26 PHP
javascript下function声明一些小结
2007/12/28 Javascript
JavaScript 设计模式学习 Singleton
2009/07/27 Javascript
浅析jquery ajax异步调用方法中不能给全局变量赋值的原因及解决方法
2014/01/10 Javascript
使用jQuery实现星级评分代码分享
2014/12/09 Javascript
jQuery插件jRumble实现网页元素抖动
2015/06/05 Javascript
JavaScript设计模式开发中组合模式的使用教程
2016/05/18 Javascript
原生js二级联动效果
2017/06/20 Javascript
import与export在node.js中的使用详解
2017/09/28 Javascript
Vue 父子组件数据传递的四种方式( inheritAttrs + $attrs + $listeners)
2018/05/04 Javascript
使用Vue调取接口,并渲染数据的示例代码
2019/10/28 Javascript
Vue的Options用法说明
2020/08/14 Javascript
[01:14:12]2018DOTA2亚洲邀请赛4.7 总决赛 LGD vs Mineski 第二场
2018/04/09 DOTA
Python程序语言快速上手教程
2012/07/18 Python
Python利用ansible分发处理任务
2015/08/04 Python
修复 Django migration 时遇到的问题解决
2018/06/14 Python
详解pyppeteer(python版puppeteer)基本使用
2019/06/12 Python
用Python写一个自动木马程序
2019/09/17 Python
Python爬虫爬取、解析数据操作示例
2020/03/27 Python
python实现简单遗传算法
2020/09/18 Python
HTML5实现签到 功能
2018/10/09 HTML / CSS
英国最大的女性服装零售商:Dorothy Perkins
2017/03/30 全球购物
英国高街电视:High Street TV
2018/05/22 全球购物
美国牛仔品牌:True Religion
2018/11/16 全球购物
加拿大最大的体育用品、鞋类和服装零售商:Sport Chek
2018/11/29 全球购物
神路信息Java面试题目
2013/03/31 面试题
中专生自我鉴定
2013/12/17 职场文书
市场开发与营销专业求职信范文
2014/05/01 职场文书
综合管理员岗位职责
2015/02/11 职场文书
2015年全国爱眼日活动小结
2015/02/27 职场文书
贷款收入证明范本
2015/06/12 职场文书
七夕情人节问候语
2015/11/11 职场文书
python3.7.2 tkinter entry框限定输入数字的操作
2021/05/22 Python
能让Python提速超40倍的神器Cython详解
2021/06/24 Python