项目成立于2019年10月17日GitHub仓库地址第1章Redis认证、持久会话存储环境准备操作系统:Macos全局安装Redis,MongoDB安装成功后,在命令行输入redis-server启动Redis服务。Redis默认占用6379端口,MongoDB默认端口为27017,需要安装Node.js的RestFul服务。connect-redis//连接rediscookie-parser//cookie解析express//Node.js框架express-session//express的session仓库redis//redis及其他依赖2.服务器端代码编写及认证思路:密码密文传输,storage使用Redis进行持久化存储Session需求写入数据库的内容可以集中写入,不存储session信息,不能访问任何接口使用pm2启动Node.js服务,保证服务器的健壮性每次前端会发送免密码登录请求,去Redis拉取数据标识例如路由免登录鉴权:app.get('/authentication',(req,res)=>{constresult=req.session;if(result){result.login&&res.send(JSON.stringify({code:0,data:'Login-free'}));return;}res.send(JSON.stringify({code:1,data:'需要密码才能登录'}));return;});完成一个需求,先了解整体架构图,再画流程图,成功一半登录,前端可以给出控制路由。登录路由的思路:每次登录,如果没有用户名,前端会格式化检测账号密码。后端只负责校验密码是否正确,是否是首次登录等(考虑到高并发)账号密码可以以key-value的形式存储在Redis中(密码都是密文)伪代码如下:redisClient.get(username,(err,value)=>{if(value&&password!==value){res.send(JSON.stringify({code:2,data:'Passworderror'}));return;}if(!req.session['login'&&!value]){redisClient.set(username,password);req.session['login']={username,login:true,password};res.send(JSON.stringify({code:0,data:'登录成功'}));return;}res.send(JSON.stringify({code:0,data:'欢迎回来'}));3.服务部署因为我们的项目需要用到session持久化存储,但是session本质上其实是用cookie传输的,而且存在跨域,所以需要在axio和Node.js服务器上配置cookieCross-domainaxiosaxios。defaults.withCredentials=true;服务器伪代码:app.all('*',function(req,res,next){res.header('Access-Control-Allow-Origin','http://localhost:5000');res.header('Access-Control-Allow-Headers','X-Requested-With');res.header('Access-Control-Allow-Methods','PUT,POST,GET,DELETE,OP方案');res.header('X-Powered-By','3.2.1')??;res.header('Content-Type','application/json;charset=utf-8');res.header('Access-Control-Allow-Credentials','true');下一个();});上面项目的代码已经大致写好了,下面需要部署到阿里云服务器上。首先,买一个轻量级的服务器,选择Node。js环境,通过苹果电脑自带的ftp将Node.js代码传到阿里云。输入验证密码后,先输入put然后将你的文件拖到命令行,然后在阿里云服务器中设置文件路径,回车即可正常上传车后,用安装的ssh命令行工具远程连接Mac自带,启动Node.js服务修改Nginx配置,反向代理80端口--->在Node.js服务监控窗口重启Nginx即可访问这里。外网已经正常访问,接口调用正常。4.前端免密码登录和路由认证。第一次渲染根组件时,发送一个ajax请求constresult=awaitauthentication();if(result.code===0){alert('免登录');this.props.history.replace('/video');}如果返回状态码为0,则可以避免登录。5.前端用户名、密码格式化及验证客户端是一个人用的,后端是一个接口。很多人用上面这句话来时刻记住,如果验证不通过,那么应该是没有能力发送请求或者进行一些有损传输和耗时的操作。当然我们的项目没有使用任何UI组件库,纯原生开发,包括下面的通信也是用到的,使用TCP长连接传输6.更新技术架构流程图。目前已经部署了RestFul风格的服务端接口。后面是长连接,把静态资源服务器的代码部署到另一台服务器,然后通过GRPC+PB协议调用~欢迎加入我们的微信群,关注我们的微信公众号:前端高峰也欢迎下面赞助我们,开源不易,欢迎Star支持
