Jsonwebtoken(JWT)是一种基于JSON的开发标准(RFC7519),用于在网络应用环境之间传递声明。令牌设计紧凑且安全。特别适用于分布式站点的单点登录(SSO)场景。JWT的语句一般用于在身份提供者和服务提供者之间传递经过认证的用户身份信息,从而从资源服务器获取资源,也可以添加一些其他业务逻辑所需要的附加语句信息。令牌也可以直接用于认证或加密。相关技术点eggmiddlewarejwt官网node-jsonwebtoken安装npminstalljsonwebtoken中间件中间件编写在中间件文件下创建jwt.js文件'usestrict'constfs=require('fs')constpath=require('path')constjwt=require('jsonwebtoken')//引入jsonwebtokenmodule.exports=(options,app)=>{returnasyncfunctionuserInterceptor(ctx,next){letauthToken=ctx.header.authorization//在header中获取授权if(authToken){authToken=authToken.substring(7)constres=verifyToken(authToken)//解密获取到的Tokenif(res.corpid&&res.userid){//如果需要限制单端登录或者取消一个token使用,或更改令牌的权限。也就是说JWT一旦发出,就一直有效,直到过期//这里使用redis保存constredis_token=awaitapp.redis.get('loginToken').get(res.corpid+res.userid)//获取保存的令牌if(authToken===redis_token){ctx.locals.corpid=res.corpidctx.locals.userid=res.useridawaitnext()}else{ctx.body={code:50012,msg:'您的账号已经在别处登录'}}}else{ctx.body={code:50012,msg:'登录状态已过期'}}}else{ctx.body={code:50008,msg:'请loginbeforeproceeding'}}}}//解密和验证functionverifyToken(token){constcert=fs.readFileSync(path.join(__dirname,'../public/rsa_public_key.pem'))//publicLetres=''try{constresult=jwt.verify(token,cert,{algorithms:['RS256']})||{}const{exp}=结果,current=Math.floor(Date.now()/1000)if(current<=exp)res=result.data||{}}catch(e){console.log(e)}returnres}使用中间件在config.default.js中添加如下配置变成了中间件的开启和配置//方法一:在应用中使用中间件config.middleware=['jwt']config.jwt={enable:true,ignore:['/api/v1/test/','/public/'],//哪些请求不需要认证}//方法二:在路由器中使用中间件module.exports=app=>{constjwt=app.middleware.jwt();app.router.get('/api/v1/test/',jwt,app.controller.test.test);};token生成建议写在helper里面,方便调用loginToken(data,expires=7200){constexp=Math.floor(Date.now()/1000)+expiresconstcert=fs.readFileSync(path.join(__dirname,'../public/rsa_private_key.pem'))//私钥,生成方法见后面consttoken=jwt.sign({data,exp},cert,{algorithm:'RS256'})returntoken}调用令牌生成方法consttoken=ctx.helper.loginToken({corpid:usersData.corpid,userid:usersData.userid},7200)//令牌生成awaitapp.redis.get('loginToken').set(usersData.corpid+usersData.userid,token,'ex',7200)//保存到redisctx.body={data:{token,expires:this.config.login_token_time},code:1,msg:'Successfullogin'}//返回前端设置headersAuthorization='Bearer'+TokenBearer例子后要加一个空格:在axios中//请求拦截器service.interceptors.request.use(config=>{if(store.getters.token){config.headers['Authorization']=`Bearer${getToken()}`}returnconfig},error=>{console.log(error)Promise.reject(error)})使用Openssl生成私钥公钥这里介绍window设置环境变量下安装git的方法我的电脑>右键>属性>高级系统设置>环境变量>路径>编辑>新建git路径\bin和git路径\usr\bin如:C:\ProgramFiles\Git\bin和C:\ProgramFiles\Git\usr\bin生成公钥:opensslgenrsa-outrsa_private_key.pem1024生成私钥:opensslrsa-inrsa_private_key.pem-pubout-outrsa_public_key.pemEND欢迎关注我的博客
