新建一个egg项目。我这里创建的是TypeScript方式npminitegg--type=tsnpminstall创建完成并安装初始化依赖文件后,需要再次安装两个包1.egg-cors跨域包2.egg-jwttoken生成及验证包npminstallegg-corsegg-jwt--save安装完成后,在根目录下的config/plugin.ts中进行配置,如:import{EggPlugin}from'egg';constplugin:EggPlugin={jwt:{enable:true,package:"egg-jwt"},cors:{enable:true,package:'egg-cors',}};导出默认插件;接下来继续在config/config.default.ts中配置:config.jwt={secret:"123456"//自定义token加密条件字符串};config.security={csrf:{enable:false,ignoreJSON:true},domainWhiteList:['http://localhost:8080'],//允许访问接口的白名单};config.cors={origin:'*',allowMethods:'GET,HEAD,PUT,POST,DELETE,PATCH'};最后一步也是TypeScript独有的坑。需要在根目录下的typings/index.d.ts文件中声明一个any类型,否则类型会出错:import'egg';declaremodule'egg'{interfaceApplication{jwt:any;}}上面的配置完成后,接下来的核心操作就开始了。首先,我在根目录下的app/router.ts中创建一个访问路由:import{Application}from'egg';exportdefault(app:Application)=>{const{controller,router,jwt}=app;//正常路由router.post('/admin/login',controller.admin.login);/**这里的second对象不再是controller,而是jwt校验对象,第三个地方是controller*只有在需要校验token的路由中才需要第二个是jwt,否则第二个对象是控制器**/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);//生成的token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJpYXQiOjE1NjAzNDY5MDN9.B95GqH-fdRpyZIE5g_T0l8RgzNyWOyXepkLiynWqrJg//返回token给前端ctx.body=token;};//访问admin数据时验证token,解析token数据publicasyncindex(){const{ctx,app}=this;console.log(ctx.state.user);/**打印出来的内容是:{username:'admin',iat:1560346903}*iat是过期时间,可以单独写中间件验证,这里就不细说了*除了iat,其他都是当时存储的数据**/ctx.body={code:0,msg:'验证成功'};}}前端请求时,需要在header中添加默认的认证词Authorization,如:axios({method:'post',url:'http://127.0.0.1:7001/admin',data:{username:'admin',lastName:'123456'},headers:{//记住不能直接发送token,而是在PrependtheBearerstring和一个空格'Authorization':`Bearer${token}`}}).then(res=>{console.log(res.data)})网上大部分的彩蛋验证token教程都不是在讲验证方法和过程,只是光顾着讲webjsontoken的原理不适合新手。我也踩了太多的坑。成功后终于写下结论了。
