基于jsonwebtoken(JWT) 的web认证 (Node版实现)
什么是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生成一个签名
工作流程
这里直接使用官网的图
他的优点是什么?
- 使用json传输数据,因此在编码时,也会更小
- 更安全
- 无需在服务端保存相关信息,只需要验证token是否有效即可
代码实现
这里使用express来创建一个服务
创建一个入口文件,主要用于一些中间件的挂载
//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') })
然后创建一个 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
因为这里使用的是公私钥的加密方式,需使用ssh-keygen生成公私钥
私钥生成:ssh-keygen -t rsa -b 2048 -f private.key公钥生成:openssl rsa -in private.key -pubout -outform PEM -out public.key
完整项目地址
参考
- https://jwt.io/introduction/
- https://tools.ietf.org/html/r...
基于jsonwebtoken(JWT) 的web认证 (Node版实现)相关推荐
- asp net html.dropdownlist viewdata 指定选中项_ASP.NET Web API基础(05)--- 基于JWT的身份认证 - 高原秃鹫...
5.1 Web API中的过滤器 WebApi下的过滤器和MVC下的过滤器有一些区别. (1) 所处命名空间不同. Web API 过滤器额命名空间是"",而MVC过滤 ...
- Node.js 使用 JWT 进行用户认证
代码地址如下: http://www.demodashi.com/demo/13847.html 运行环境 该项目基于 node(v7.8.0版本以上) 和 mongodb 数据库,因此电脑上需要安装 ...
- 基于JWT的Token认证机制实现
一.基于JWT的Token认证机制实现 1.什么是JWT JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息. 2.JWT组成 ...
- JWT—JSON Web Token - 理解JWT网络间应用用户安全认证交互设计
原文地址:http://blog.leapoahead.com/2015/09/06/understanding-jwt/ 官网地址:https://jwt.io/ JSON Web Token(JW ...
- sau交流学习社区-songEagle开发系列:Vue + Vuex + Koa 中使用JWT(JSON Web Token)认证
一.前言 JWT(JSON Web Token),是为了在网络环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519). JWT不是一个新鲜的东西,网上相关的介绍已经非常多了.不是很了解的 ...
- jwt重放攻击_【干货分享】基于JWT的Token认证机制及安全问题
一步一步教你基于JWT的Token认证机制实现,以及如何防范XSS攻击.Replay攻击和中间人攻击. 文章目录 一.几种常用的认证机制 1.1 HTTP Basic Auth HTTP Basic ...
- 基于JWT(Json Web Token)的授权方式
JWT 是JSON风格轻量级的授权和身份认证规范,可实现无状态.分布式的Web应用授权: 从客户端请求服务器获取token, 用该token 去访问实现了jwt认证的web服务器. token 可保存 ...
- jquery字体颜色_基于jquery实现的web版excel
基于jquery实现的web版excel.包含excel的基本功能 支持合并单元格,拆分单元格 支持插入单元格,删除单元格 支持整行整列选择单元格 自定义右键菜单,可以设置单元格数量 支持鼠标左键拖动 ...
- 基于shiro+jwt的真正rest url权限管理,前后端分离
代码地址如下: http://www.demodashi.com/demo/13277.html bootshiro & usthe bootshiro是基于springboot+shiro+ ...
- php 完全前后端分离使用jwt,前后端分离,在 angular 8 中利用 JWT 进行身份认证
最近项目项目中用angular8进行前端开发,所以近期会收集整理angular相关的文章发出来,中间遇到的坑也会发出来.本文原文是angular6的,不过angular8同样适用. JWT 是什么,为 ...
最新文章
- mysql 选项_mysql常用选项
- The 2014 ACM-ICPC Asia Mudanjiang Regional Contest(2014牡丹江区域赛)
- windows上安装Anaconda和python
- C# 正则表达式编写及验证方法
- 怎样批量获取文件名,批量提取文件名 文件名读取windows 批处理文件
- 小米登录协议分析_联想前副总裁常程跳槽小米数月后,波澜再起
- ASP+页缓存OutputCache Duration用法
- 神州租车:陆正耀辞任公司董事会主席及非执行董事职务
- Django之form组件加cookie,session
- 问题六十九:阴影(Shadow)——原理和C++实现
- Apache JMeter 5.1.1 发布,压力测试工具
- linux打jar包命令行,windows下命令行打jar包方法
- 斯皮尔曼相关(Spearman correlation)系数概述及其计算例
- Android自动化测试框架Robotium
- 关于银行卡四要素返回数据解析问题
- 制作一个简单的钓鱼网站
- 如何设置电脑的固定IP地址
- 【SmartDental】小组第一次会议纪要
- Windows 2008 R2 标准版 ie提示 当前安全设置不允许下载该文件 解决办法
- pika详解(二) BlockingConnection
热门文章
- Atitit 读取文本文件内容功能的实现 艾提拉 总结 attilax总结 1.1. FileUtilsAti.readFileToStringAutoDetectEncode(txtF);	1 1
- Atitit 可移植性之道attilax著
- paip.mysql 全文索引查询空白解决
- ECLIPSE远程调试TOMCAT.
- 美国基金教父约翰博格传记(1)
- 技术人 | 为什么我们的系统会如此复杂?
- 中国工程院院士郑纬民:应鼓励从头研发先进的存储系统软件
- 云智能资深专家崮德:谈谈我对华为HarmonyOS 2.0的看法
- 【力学】基于matlab立铣刀力模拟仿真【含Matlab源码 193期】
- 【优化算法】人工生态系统优化算法(AEO)【含Matlab源码 023期】