什么是JSON Web Token ?

官方给出的定义是:
JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、独立的方式,用于安全地在当事人之间传递信息作为一个JSON对象。这些信息可以被验证和信任,因为它是数字签名的。JWTs可以使用一个secret (使用HMAC算法)或使用RSA的公钥/私钥对来签名。 文中我们使用公私钥的加密方式。

结构

由下面三个部分组成一个token字符串

  • Header

    • header通常由两个部分组成:令牌的type,即JWT,以及正在使用的散列算法,如HMAC SHA256或RSA。
  • Payload ,包含三个类型,自定义部分可以存储一些信息,如:用户信息、角色等;

    • Registered claims:已注册的,具体属性,点击传送
    • Public claims:自定义的,具体属性,点击传送
    • Private claims:这是在同意使用它们的各方之间共享信息的自定义声明,并且既没有注册也没有公开声明。
  • Signature

    • 使用header、payload和secret生成一个签名

工作流程

这里直接使用官网的图

他的优点是什么?

  1. 使用json传输数据,因此在编码时,也会更小
  2. 更安全
  3. 无需在服务端保存相关信息,只需要验证token是否有效即可

代码实现

这里使用express来创建一个服务

  1. 创建一个入口文件,主要用于一些中间件的挂载

    //index.jsconst express = require('express')
    const app  = express()
    // 使用body-parser获取请求body
    const bodyParser = require('body-parser');
    const cookieParser = require('cookie-parser')// 引入路由中间件
    const routerAdmin = require('./app/router-admin')app.use(bodyParser.json()); // for parsing application/json
    app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded
    app.use(cookieParser())// 加载路由模块
    app.use('/admin',routerAdmin);app.listen(3000,function(){console.log('port 3000 start')
    })
  2. 然后创建一个 app/router-admin.js 生成需要用到认证的路由中间件,这里我是在mongodb中取的用户信息,也可以自行模拟数据

    //router-admin.js const express = require('express')
    const router = express.Router()
    var MongoClient = require('mongodb').MongoClient;const jwt = require('jsonwebtoken')
    const fs = require('fs')
    // const secretStr = 'sdfsjfklsjfiewjwoieow'// 根据mongodb生成的_id查询数据
    var ObjectId = require('mongodb').ObjectId
    var url = "mongodb://localhost:27017/";var payload = {user : 'william',admin : true
    }router.post('/login',function(req,res){let name = req.body.name,pwd = req.body.pwd;var cert = fs.readFileSync('./private.key')MongoClient.connect(url, function(err, db) {if (err) throw err;var dbo = db.db("blog");var noSqlStr = {name:name,pwd:pwd}dbo.collection("userlist"). find(noSqlStr).toArray(function(err, result) { // 返回集合中所有数据if (err) throw err;// console.log(result);// 验证通过,服务端回传tokenif(!!result.length){var token = jwt.sign(payload, cert, { algorithm: 'RS256' ,expiresIn:'30s'});res.send({status : true,msg : '',token : token})}          db.close();});});
    })// 验证jsonwebtoken是否过期的中间件,在login接口后面执行,除了login接口的请求外,其他接口都需要验证token
    router.use(function jwtVerify(req, res, next) {let token = req.get('token')console.log(token)var cert = fs.readFileSync('./public.key');  // 先解密jwt.verify(token, cert,function(err,decoded){if(err || !decoded) res.send({data:null,status:false,msg:err})if(decoded.user == payload.user){next();}});
    });router.get('/search',function(req,res){res.send({data:'查询成功',msg:'',status:true})
    })module.exports = router
  3. 因为这里使用的是公私钥的加密方式,需使用ssh-keygen生成公私钥

        私钥生成:ssh-keygen -t rsa -b 2048 -f private.key公钥生成:openssl rsa -in private.key -pubout -outform PEM -out public.key

完整项目地址

参考

  1. https://jwt.io/introduction/
  2. https://tools.ietf.org/html/r...

基于jsonwebtoken(JWT) 的web认证 (Node版实现)相关推荐

  1. asp net html.dropdownlist viewdata 指定选中项_ASP.NET Web API基础(05)--- 基于JWT的身份认证 - 高原秃鹫...

    5.1 Web API中的过滤器 WebApi下的过滤器和MVC下的过滤器有一些区别. (1)       所处命名空间不同. Web API 过滤器额命名空间是"",而MVC过滤 ...

  2. Node.js 使用 JWT 进行用户认证

    代码地址如下: http://www.demodashi.com/demo/13847.html 运行环境 该项目基于 node(v7.8.0版本以上) 和 mongodb 数据库,因此电脑上需要安装 ...

  3. 基于JWT的Token认证机制实现

    一.基于JWT的Token认证机制实现 1.什么是JWT JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息. 2.JWT组成 ...

  4. JWT—JSON Web Token - 理解JWT网络间应用用户安全认证交互设计

    原文地址:http://blog.leapoahead.com/2015/09/06/understanding-jwt/ 官网地址:https://jwt.io/ JSON Web Token(JW ...

  5. sau交流学习社区-songEagle开发系列:Vue + Vuex + Koa 中使用JWT(JSON Web Token)认证

    一.前言 JWT(JSON Web Token),是为了在网络环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519). JWT不是一个新鲜的东西,网上相关的介绍已经非常多了.不是很了解的 ...

  6. jwt重放攻击_【干货分享】基于JWT的Token认证机制及安全问题

    一步一步教你基于JWT的Token认证机制实现,以及如何防范XSS攻击.Replay攻击和中间人攻击. 文章目录 一.几种常用的认证机制 1.1 HTTP Basic Auth HTTP Basic ...

  7. 基于JWT(Json Web Token)的授权方式

    JWT 是JSON风格轻量级的授权和身份认证规范,可实现无状态.分布式的Web应用授权: 从客户端请求服务器获取token, 用该token 去访问实现了jwt认证的web服务器. token 可保存 ...

  8. jquery字体颜色_基于jquery实现的web版excel

    基于jquery实现的web版excel.包含excel的基本功能 支持合并单元格,拆分单元格 支持插入单元格,删除单元格 支持整行整列选择单元格 自定义右键菜单,可以设置单元格数量 支持鼠标左键拖动 ...

  9. 基于shiro+jwt的真正rest url权限管理,前后端分离

    代码地址如下: http://www.demodashi.com/demo/13277.html bootshiro & usthe bootshiro是基于springboot+shiro+ ...

  10. php 完全前后端分离使用jwt,前后端分离,在 angular 8 中利用 JWT 进行身份认证

    最近项目项目中用angular8进行前端开发,所以近期会收集整理angular相关的文章发出来,中间遇到的坑也会发出来.本文原文是angular6的,不过angular8同样适用. JWT 是什么,为 ...

最新文章

  1. mysql 选项_mysql常用选项
  2. The 2014 ACM-ICPC Asia Mudanjiang Regional Contest(2014牡丹江区域赛)
  3. windows上安装Anaconda和python
  4. C# 正则表达式编写及验证方法
  5. 怎样批量获取文件名,批量提取文件名 文件名读取windows 批处理文件
  6. 小米登录协议分析_联想前副总裁常程跳槽小米数月后,波澜再起
  7. ASP+页缓存OutputCache Duration用法
  8. 神州租车:陆正耀辞任公司董事会主席及非执行董事职务
  9. Django之form组件加cookie,session
  10. 问题六十九:阴影(Shadow)——原理和C++实现
  11. Apache JMeter 5.1.1 发布,压力测试工具
  12. linux打jar包命令行,windows下命令行打jar包方法
  13. 斯皮尔曼相关(Spearman correlation)系数概述及其计算例
  14. Android自动化测试框架Robotium
  15. 关于银行卡四要素返回数据解析问题
  16. 制作一个简单的钓鱼网站
  17. 如何设置电脑的固定IP地址
  18. 【SmartDental】小组第一次会议纪要
  19. Windows 2008 R2 标准版 ie提示 当前安全设置不允许下载该文件 解决办法
  20. pika详解(二) BlockingConnection

热门文章

  1. Atitit 读取文本文件内容功能的实现 艾提拉 总结 attilax总结 1.1. FileUtilsAti.readFileToStringAutoDetectEncode(txtF); 1 1
  2. Atitit 可移植性之道attilax著
  3. paip.mysql 全文索引查询空白解决
  4. ECLIPSE远程调试TOMCAT.
  5. 美国基金教父约翰博格传记(1)
  6. 技术人 | 为什么我们的系统会如此复杂?
  7. 中国工程院院士郑纬民:应鼓励从头研发先进的存储系统软件
  8. 云智能资深专家崮德:谈谈我对华为HarmonyOS 2.0的看法
  9. 【力学】基于matlab立铣刀力模拟仿真【含Matlab源码 193期】
  10. 【优化算法】人工生态系统优化算法(AEO)【含Matlab源码 023期】