在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 相关文章推荐
兼容IE/Firefox/Opera/Safari的检测页面装载完毕的脚本Ext.onReady的实现
Jul 14 Javascript
html+css+js实现xp window界面及有关功能
Mar 26 Javascript
Javascript数组与字典用法分析
Dec 13 Javascript
js实现仿Windows风格选项卡和按钮效果实例
May 13 Javascript
bootstrap模态框垂直居中效果
Dec 03 Javascript
canvas学习之API整理笔记(二)
Dec 29 Javascript
基于ExtJs在页面上window再调用Window的事件处理方法
Jul 26 Javascript
微信小程序实现图片上传、删除和预览功能的方法
Dec 18 Javascript
swiper自定义分页器使用方法详解
Sep 14 Javascript
webpack将js打包后的map文件详解
Feb 22 Javascript
JS中的函数与对象的创建方式
May 12 Javascript
vue+Element-ui实现分页效果
Nov 15 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
Zend公司全球首推PHP认证
2006/10/09 PHP
随时给自己贴的图片加文字的php水印
2007/03/16 PHP
php下把数组保存为文件格式的实例应用
2010/02/08 PHP
PHP中读写文件实现代码
2011/10/20 PHP
将酷狗krc歌词解析并转换为lrc歌词php源码
2014/06/20 PHP
php中file_get_content 和curl以及fopen 效率分析
2014/09/19 PHP
php实现网站留言板功能
2015/11/04 PHP
PHP如何使用Memcached
2016/04/05 PHP
php简单生成一组与多组随机字符串的方法
2017/05/09 PHP
PHP设计模式之建造者模式(Builder)原理与用法案例详解
2019/12/12 PHP
javascript 写类方式之五
2009/07/05 Javascript
浅析Javascript使用include/require
2013/11/13 Javascript
jquery实现鼠标滑过后动态图片提示效果实例
2015/08/10 Javascript
JavaScript拖拽、碰撞、重力及弹性运动实例分析
2016/01/08 Javascript
详解Vue监听数据变化原理
2017/03/08 Javascript
JS实现问卷星自动填问卷脚本并在两秒自动提交功能
2020/06/17 Javascript
JS实现json对象数组按对象属性排序操作示例
2018/05/18 Javascript
基于vue和react的spa进行按需加载的实现方法
2018/09/29 Javascript
原生JavaScript实现刮刮乐
2020/09/29 Javascript
[46:57]EG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[30:55]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第二场 11.18
2020/11/18 DOTA
python实现的简单猜数字游戏
2015/04/04 Python
linux下python抓屏实现方法
2015/05/22 Python
详解Python中open()函数指定文件打开方式的用法
2016/06/04 Python
Python中的集合介绍
2019/01/28 Python
selenium中get_cookies()和add_cookie()的用法详解
2020/01/06 Python
python中rb含义理解
2020/06/18 Python
css3给背景图片加颜色遮罩的方法
2019/11/05 HTML / CSS
香港万宁官方海外旗舰店:香港健与美连锁店
2018/09/27 全球购物
美国饼干礼物和美食甜点购买网站:Cheryl’s
2020/05/28 全球购物
介绍一下linux文件系统分配策略
2013/02/25 面试题
搬家公司的创业计划书
2014/01/01 职场文书
童装店创业计划书
2014/01/09 职场文书
付款证明模板
2015/06/19 职场文书
教师廉政准则心得体会
2016/01/20 职场文书
Python if else条件语句形式详解
2022/03/24 Python