当前位置: 首页 > 后端技术 > Node.js

jwt在node中的应用与实践

时间:2023-04-03 16:05:16 Node.js

介绍:由于http是无状态的,在请求响应过程中不会存储和记录用户身份信息,所以有很多方法来识别用户和存储用户身份,比如cookie,会议,智威汤逊。最近做的一个接口服务使用jwt来存储和管理用户信息。相对于本地cookie存储和服务器端session存储,jwt变得更加安全和便捷。简单总结。目录jwt介绍安装配置封装方法实践实践本文从以上四个方面介绍了jwt的使用。jwt简介概念JWT全称JSONWebToken,是一个开放标准RFC7519,它定义了一种紧凑且自包含的方式,以JSON对象的形式在各??方之间安全地传输信息。可以使用私钥或使用RSA或ECDSA的公钥/私钥对对JWT进行签名,并且可以验证签名。Componentsjwt签名令牌一般由三部分组成,分别是Header(头部信息)、Payload(负载)、Signature(签名),比如xxxxx.yyyyy.zzzzz。header一般存放token的类型和签名算法,例如:{"alg":"HS256","typ":"JWT"}Payload一般存放statement,即用户信息和附件数据,即分为注册声明、公开声明和私人声明。例如:{"sub":"1234567890","name":"JohnDoe","admin":true}签名使用签名算法对Header和Payload进行签名例如:HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret)那么一个标准的jwt签名令牌会是这样的eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c。应用场景用户授权访问例如用户登录后,服务端向客户端发送一个jwttoken。用户每次请求数据时,都会在请求头中携带token,服务器校验通过后即可获取数据。这种方式开销很小,服务器端不需要存储,可以跨域使用。信息交换存储各方之间的加密信息,并验证签名内容是否被篡改。安全性由于token是可以拆解的,所以里面的header和Payload是可以解析看到的,所以尽量不要在Payload中存储一些隐私信息。安装配置接下来在node中使用jwt进行一些操作。在npm网站上,有很多jwt包,你可以选择你认为合适的。搜索jwtNAME|说明|作者|日期|版本|关键词jwt|用于……的JSONWeb令牌|=mattrobenolt|2012-05-05|0.2.0|快递jwt|JWT认证...|=woloski…|2021-08-11|6.1.0|authauthn身份验证authz授权httpjwt令牌oauthexpressjsonwebtoken|JSON网络令牌...|=dschenkelman…|2019-03-18|8.5.1|jwtjwt解码|解码JWT令牌,...|=jeff.shuman...|2020-11-16|3.1.2|jwtbrowserpassport-jwt|护照...|=themikenichol…|2018-03-13|4.0.0|Passport策略JSONWebTokenJWTkoa-jwt|Koa中间件...|=stiang…|2021-09-24|4.0.3|authauthn身份验证authz授权httpjwtjson中间件令牌oauth权限koajsrsasign|开源免费...|=kjur|2021-12-01|10.5.1|加密密码学密码RSAECDSADSARSAPSSPKCS#1PKCS#5PKCS#8私钥公钥CSRPKCS#10哈希函数HMacASN.1certexpress-jwt-permissions|快递中间件...|=愤怒的独角兽...|2021-08-18|1.3.6|express中间件JWT权限授权令牌securitynjwt|JWT库……|=罗伯特|2021-12-03|1.2.0|jwtfastify-jwt|JWT实用程序...|=starptech…|2021-12-03|4.1.0|jwtjson令牌jsonwebtokenfastifydid-jwt|签名库...|=simonas-notcat…|2021-12-03|5.12.1|hapi-auth-jwt2|Hapi.js…|=尼尔森|2020-09-08|10.2.0|Hapi.js身份验证AuthJSONWeb令牌JWTauth0-lock|Auth0锁|=jeff.shuman...|2021-11-02|11.31.1|auth0authopenid认证无密码浏览器jwtjwks-rsa|要重试的库已经...|=jeff.shuman...|2021-10-15|2.0.5|jwksrsajwtrestify-jwt-社区|JWT认证...|=frbuceta|2021-12-05|1.1.21|oauthrestifydid-jwt-vc|创建并验证...|=simonas-notcat...|2021-11-23|2.1.8|智威汤逊服务|一个简单的包装...|jwtknifecycleangular-jwt|图书馆来帮助你...|=jeff.shuman...|2019-03-20|0.1.11|@thream/socketio-jwt|验证...|=divlo|套接字socket.iojwtappstore-connect-jwt-gene|[![npm](https://nod...|=poad|2021-10-15|1.0.1|jwtappstoreerator-core|安装jwt我个人觉得这个jsonwebtoken很好,本文用到这个包npmijsonwebtoken常用签名签名语法:jwt.sign(payload,secretOrPrivateKey,[options,callback])。例如://通用签名varjwt=require('jsonwebtoken');vartoken=jwt.sign({foo:'bar'},'secret');//私钥签名varprivateKey=fs.readFileSync('private.key');vartoken=jwt.sign({foo:'bar'},privateKey,{algorithm:'RS256'});//设置过期时间jwt.sign({data:'bar'},'secret',{expiresIn:60*60});//1h验证验证语法:jwt.verify(token,secretOrPublicKey,[options,callback])例如://通用验证vardecoded=jwt.verify(token,'secret');console.log(decoded.foo)//bar//公钥验证varcert=fs.readFileSync('public.pem');jwt.verify(token,cert,function(err,decoded){console.log(decoded.foo)//bar});decoding解码语法:jwt.decode(token[,options])例如:vardecoded=jwt.decode(token,{complete:true});console.log(decoded.header);console.log(decoded.payload);封装方式根据安装配置中的方式,您可以根据自己的需要进行二次封装,更适合您。引入依赖包和配置constjwt=require("jsonwebtoken");constconfig={secret:'2021123456**',time:60*60,}signaturefunctioncreate(data,time){lettoken=jwt.sign(data,config.secret,{algorithm:"HS256",expiresIn:time||config.time,})returntoken;}verifyfunctionverify(token){returnjwt.verify(token,config.secret,function(err,decoded){if(err){返回{code:1,msg:'invalid',data:null,}}else{return{code:2,msg:'valid',data:decoded,}}})}解码函数decoded(token,complete=true){returnjwt.decode(token,{complete,});}以上是比较简单的方法,如果你还想使用公钥和私钥,可以按照上面安装配置中的说明使用。实战练习经过上面的封装方法,大家可以来实战练习看看有没有效果。新建文件夹test,新建文件index.js存放测试用例,jwt.js存放调用方法。mkdirtestcdtestnpminit-ynpmijsonwebtokenjwt方法//jwt.jsconstjwt=require('jsonwebtoken');constconfig={secret:'2021123456',//keytime:60*60,//过期时间}//创建签名令牌functioncreate(data,time){lettoken=jwt.sign(data,config.secret,{algorithm:'HS256',expiresIn:time||config.time,});returntoken;}//验证令牌functionverify(token){returnjwt.verify(token,config.secret,function(err,decoded){if(err){return{code:1,msg:'invalid',data:null,}}else{return{code:2,msg:'valid',data:decoded,}}})}//解码令牌函数decoded(token,complete=true){returnjwt.decode(token,{完成,});}consttoken={创建,验证,解码,}module.exports=token;创建令牌、验证令牌、解码令牌//index.jsconstjwt=require('./jwt');//生成令牌lettoken=jwt.create({'id':1,'name':'mark'},60*60*2);console.log(令牌);/*eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwibmFtZSI6Im1hcmsiLCJpYXQiOjE2MzkxMDYyNzMsImV4cCI6MTYzOTExMzQ3M30.20O1r0NVMf-j-9RwNcgls9ja0n1rGqSKN51_cRcvpE8*///验证令牌letverifyRes=jwt.verify(token);console.log(verifyRes);/*{code:2,msg:'valid',data:{id:1,name:'mark',iat:1639106273,exp:1639113473}}*///解码令牌letdeRes=jwt.解码(令牌,真);console.log(deRes);/*{header:{alg:'HS256',typ:'JWT'},payload:{id:1,name:'mark',iat:1639106273,exp:1639113473},signature:'20O1r0NVMf-j-9RwNcgls9ja0n1rGqSKN51_cRcvpE8'}*/运行命令nodeindex.js测试是否正确。以上就是jwt在node中的一些应用和实用方法!