在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 相关文章推荐
jQuery EasyUI 的EasyLoader功能介绍
Sep 12 Javascript
Javascript 多浏览器兼容总结(实战经验)
Oct 30 Javascript
window.print打印指定div指定网页指定区域的方法
Aug 04 Javascript
深入理解Angular2 模板语法
Aug 07 Javascript
Vue.js第二天学习笔记(vue-router)
Dec 01 Javascript
jQuery自定义多选下拉框效果
Jun 19 jQuery
jQuery实现表格隔行换色
Sep 01 jQuery
微信小程序实现点击卡片 翻转效果
Sep 04 Javascript
在VUE中实现文件下载并判断状态的方法
Nov 08 Javascript
实例分析JS中的相等性判断===、 ==和Object.is()
Nov 17 Javascript
Vue data的数据响应式到底是如何实现的
Feb 11 Javascript
uniapp微信小程序实现一个页面多个倒计时
Nov 01 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中for循环语句的几种变型
2007/03/16 PHP
linux系统上支持php的 iconv()函数的方法
2011/10/01 PHP
Linux下实现PHP多进程的方法分享
2012/08/16 PHP
PHP多个图片压缩成ZIP的方法
2020/08/18 PHP
PHP PDOStatement::closeCursor讲解
2019/01/30 PHP
PHP7使用ODBC连接SQL Server2008 R2数据库示例【基于thinkPHP5.1框架】
2019/05/06 PHP
jQuery 研究心得 取得属性的值
2007/11/30 Javascript
CCPry JS类库 代码
2009/10/30 Javascript
JavaScript表达式:URL 协议介绍
2013/03/10 Javascript
JS完成代码前最好对其做5件事
2013/04/07 Javascript
JS JQUERY实现滚动条自动滚到底的方法
2015/01/09 Javascript
使用堆实现Top K算法(JS实现)
2015/12/25 Javascript
JavaScript实现简单的tab选项卡切换
2016/01/05 Javascript
bootstrap模态框跳转到当前模板页面 框消失了而背景存在问题的解决方法
2020/11/30 Javascript
nodejs实现OAuth2.0授权服务认证
2017/12/27 NodeJs
Vue 开发音乐播放器之歌手页右侧快速入口功能
2018/08/08 Javascript
es6基础学习之解构赋值
2018/12/10 Javascript
vue.js路由mode配置之去掉url上默认的#方法
2019/11/01 Javascript
JavaScript实现公告栏上下滚动效果
2020/03/13 Javascript
Python yield使用方法示例
2013/12/04 Python
python制作最美应用的爬虫
2015/10/28 Python
Python中字符串的格式化方法小结
2016/05/03 Python
Python使用sftp实现上传和下载功能(实例代码)
2017/03/14 Python
Python 的类、继承和多态详解
2017/07/16 Python
浅析Python 实现一个自动化翻译和替换的工具
2019/04/14 Python
Python Web框架之Django框架Model基础详解
2019/08/16 Python
对Django中内置的User模型实例详解
2019/08/16 Python
python实现三壶谜题的示例详解
2020/11/02 Python
美国著名的品牌折扣店:Burlington
2017/06/08 全球购物
澳大利亚墨水站Ink Station:墨水和碳粉打印机墨盒
2019/03/24 全球购物
加拿大拼图大师:Puzzle Master
2020/12/28 全球购物
拓展培训心得体会
2014/01/04 职场文书
党的群众路线教育实践活动总结报告
2014/07/03 职场文书
2014年档案室工作总结
2014/12/01 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
apache虚拟主机配置的三种方式(小结)
2022/07/23 Servers