在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 相关文章推荐
IE6/7/8中Option元素未设value时Select将获取空字符串
Apr 07 Javascript
Chosen 基于jquery的选择框插件使用方法
May 30 Javascript
Js+php实现异步拖拽上传文件
Jun 23 Javascript
jQuery短信验证倒计时功能实现方法详解
May 25 Javascript
JS实用的带停顿的逐行文本循环滚动效果实例
Nov 23 Javascript
JS和jQuery通过this获取html标签中的属性值(实例代码)
Sep 11 jQuery
JavaScript实现离开页面前提示功能【附jQuery实现方法】
Sep 26 jQuery
浅谈Vue初学之props的驼峰命名
Jul 19 Javascript
Vue项目数据动态过滤实践及实现思路
Sep 11 Javascript
vue实现pdf文档在线预览功能
Nov 26 Javascript
JS画布动态实现黑客帝国背景效果
Nov 08 Javascript
javascript前端实现多视频上传
Dec 13 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
颠覆常识!无色透明的咖啡诞生了(中日双语)
2021/03/03 咖啡文化
php实现简单洗牌算法
2013/06/18 PHP
php命名空间学习详解
2014/02/27 PHP
详解js异步文件加载器
2016/01/24 PHP
PHP _construct()函数讲解
2019/02/03 PHP
用JS实现一个页面多个css样式实现
2008/05/29 Javascript
!DOCTYPE声明对JavaScript的影响分析
2010/04/12 Javascript
jQuery获取地址栏参数插件(模仿C#)
2010/10/26 Javascript
jQuery阻止冒泡和HTML默认操作
2010/11/17 Javascript
基于Jquery的将DropDownlist的选中值赋给label的实现代码
2011/05/06 Javascript
解决微信浏览器Javascript无法使用window.location.reload()刷新页面
2016/06/21 Javascript
浅谈JS中的bind方法与函数柯里化
2016/08/10 Javascript
Javascript实现图片懒加载插件的方法
2016/10/20 Javascript
详解JavaScript模块化开发
2016/12/04 Javascript
gulp解决跨域的配置文件问题
2017/06/08 Javascript
JS库 Highlightjs 添加代码行号的实现代码
2017/09/13 Javascript
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
2017/10/24 Javascript
在 Angular6 中使用 HTTP 请求服务端数据的步骤详解
2018/08/06 Javascript
vue.js中使用echarts实现数据动态刷新功能
2019/04/16 Javascript
Vue修改项目启动端口号方法
2019/11/07 Javascript
微信小程序 scroll-view 实现锚点跳转功能
2019/12/12 Javascript
微信小程序之左右布局的实现代码
2019/12/13 Javascript
Python 使用SMTP发送邮件的代码小结
2016/09/21 Python
python中使用print输出中文的方法
2018/07/16 Python
解决Python下json.loads()中文字符出错的问题
2018/12/19 Python
基于Python函数和变量名解析
2019/07/19 Python
深入理解Tensorflow中的masking和padding
2020/02/24 Python
解决Django响应JsonResponse返回json格式数据报错问题
2020/08/09 Python
python实现人工蜂群算法
2020/09/18 Python
Html5剪切板功能的实现代码
2018/06/29 HTML / CSS
美国演唱会订票网站:Ticketmaster美国
2017/10/05 全球购物
巴西男士胡须和头发护理产品商店:Beard
2017/11/13 全球购物
乌克兰鞋类购物网站:Eobuv.com.ua
2020/11/28 全球购物
酒店管理专业毕业生推荐信
2013/11/10 职场文书
九年级历史教学反思
2014/01/27 职场文书
实名检举信范文
2015/03/02 职场文书