什么是JSONWebToken?官方的定义是:JSONWebToken(JWT)是一个开放标准(RFC7519),它定义了一种紧凑的、独立的、自包含的方式,用于在各方之间安全地传递信息作为JSON对象。此信息可以被验证和信任,因为它是经过数字签名的。JWT可以使用秘密(使用HMAC算法)或使用RSA公钥/私钥对进行签名。在本文中,我们使用公私密钥加密。该结构由以下三部分组成一个tokenstringHeader通常由两部分组成:token的类型,即JWT,以及使用的哈希算法,如HMACSHA256或RSA。Payload,包括三种类型,自定义部分可以存储一些信息,比如:用户信息,角色等;Registeredclaims:已注册,具体属性,点击发送Publicclaims:自定义,具体属性,点击发送Privateclaims:这是一种自定义声明,在同意使用它们的各方之间共享信息,既没有注册也没有公开声明。Signature使用header、payload和secret来生成签名工作流程。这里直接用官网图有什么好处?使用json传输数据,所以编码时会更小更安全挂载中间件//index.jsconstexpress=require('express')constapp=express()//使用body-parser获取请求bodyconstbodyParser=require('body-parser');constcookieParser=require('cookie-parser')//导入路由中间件constrouterAdmin=require('./app/router-admin')app.use(bodyParser.json());//用于解析application/jsonapp.use(bodyParser.urlencoded({extended:true}));//用于解析application/x-www-form-urlencodedapp.use(cookieParser())//加载路由模块app.use('/admin',routerAdmin);app.listen(3000,function(){console.log('port3000start')})然后创建一个app/router-admin.js来生成需要认证的路由中间件。这里我取的是mongodb中的用户信息。也可以自己模拟数据//router-admin.jsconstexpress=require('express')constrouter=express.Router()varMongoClient=require('mongodb').MongoClient;constjwt=require('jsonwebtoken')constfs=require('fs')//constsecretStr='sdfsjfklsjfiewjwoieow'//根据mongodb生成的_id查询数据varObjectId=require('mongodb').ObjectIdvarurl="mongodb://localhost:27017/";varpayload={user:'william',admin:true}router.post('/login',function(req,res){letname=req.body.name,pwd=req.body.pwd;varcert=fs.readFileSync('./private.key')MongoClient.connect(url,function(err,db){if(err)throwerr;vardbo=db.db("blog");varnoSqlStr={name:name,pwd:pwd}dbo.collection("userlist").find(noSqlStr).toArray(function(err,result){//返回集合中的所有数据if(err)throwerr;//console.log(result);//验证通过,服务器返回tokenif(!!result.length){vartoken=jwt.sign(payload,cert,{algorithm:'RS256',expiresIn:'30s'});res.send({status:true,msg:'',令牌:令牌})}数据库关闭();});});})//验证jsonwebtoken是否过期的中间件在登录界面后面执行。除了登录接口的请求,其他接口需要验证tokenrouter.use(functionjwtVerify(req,res,next){lettoken=req.get('token')console.log(token)varcert=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生成公私钥keys私钥生成:ssh-keygen-trsa-b2048-fprivate.key公钥生成:opensslrsa-inprivate.key-pubout-outformPEM-outpublic.key完整项目地址参考https://jwt.io/介绍/https://tools.ietf.org/html/r...
