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

入门-Egg-jwt

时间:2023-04-03 14:58:58 Node.js

egg.js入门继续一点点学习吧,这次的学习内容是和egg-jwt相关的。新建一个egg项目这里新建一个egg项目,这里使用ts模式。npminitegg--type=tsnpminstall安装相关包这里创建安装后需要再次初始化两个包,分别是egg-cors和egg-jwttoken生成的验证包。npminstallegg-corsegg-jwt--save配置相关插件这里配置相关插件import{EggPlugin}from'egg';constplugin:EggPlugin={jwt:{enable:true,package:"egg-jwt"},cors:{enable:true,package:'egg-cors',}};导出默认插件;配置默认配置文件config.jwt={secret:"123456"//自定义令牌加密条件字符串};config.security={csrf:{enable:false,ignoreJSON:true},domainWhiteList:['http://localhost:8080'],//允许访问接口白名单};config.cors={origin:'*',allowMethods:'GET,HEAD,PUT,POST,DELETE,PATCH'};到这里就完成了相关的默认配置。在根目录中声明any类型。这里需要在下面的目录下声明一个any类型,用于向前后端发送相关的字符串参数。导入'egg';声明模块'egg'{接口应用程序{jwt:any;}}配置相关路由这里在app/router.ts中创建相关路由//正常路由router.post('/admin/login',controller.admin.login);/**这里的second对象不再是controller,而是jwt验证对象,第三个地方是controller*只有需要验证token的路由时,second才是jwt,否则就是second对象控制器**/router.post('/admin',jwt,controller.admin.index);};相关路由配置在这里。编写路由对应的控制器。这里写路由对应的controller。这个控制器在app/controller/home.ts目录下import{Controller}from'egg';exportdefaultclassAdminControllerextendsController{//验证登录并生成令牌publicasynclogin(){const{ctx,app}=this;//获取客户端传过来的参数constdata=ctx.request.body;//验证data数据是否登录成功//......//成功后做一些操作//生成token的方式consttoken=app.jwt.sign({username:data.username,//tokendata待存储//...},app.config.jwt.secret);//生成的令牌=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJpYXQiOjE1NjAzNDY5MDN9.B95GqH-fdRpyZIE5g_T0l8RgzNyWOyXepkLiynWqrJg};//访问admin数据时进行验证token,并解析token的数据publicasyncindex(){const{ctx,app}=this;控制台日志(ctx.state.user);/**打印出来的内容是:{username:'admin',iat:1560346903}*iat是过期时间,中间件验证可以单独写,这里就不细说了*除了iat,其他都是当时存储的数据**/ctx.body={code:0,msg:'验证成功'};}}前端请求匹配。这里只需要在前端的授权字段中添加相关的配置信息即可。axios({method:'post',url:'http://127.0.0.1:7001/admin',data:{username:'admin',lastName:'123456'},headers:{//切记不要发送直接token,在Bearer字符串前面加一个空格'Authorization':`Bearer${token}`}}).then(res=>{console.log(res.data)})到这里完成egg。js结合jwt完成相关验证小技巧这里是一个小tip的插曲,这里是jsonwebtoken的使用。这里使用jsonwebtoken来实现token相关的认证机制。install这里安装相关依赖npminstalljsonwebtoken写中间件在中间件文件下新建jwt.ts文件'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在卸载文件这里生成,用于调用,生成相关tokenloginToken(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'}//返回给前端前端这里使用headers,后面加上相关空格示例:在axios//请求拦截器中service.interceptors.request.use(config=>{if(store.getters.token){config.headers['Authorization']=`Bearer${getToken()}`}},error=>{console.log(error)Promise.reject(error)})这样就完成了相关jwt的生成和使用。