1: web开发模式
1.1:服务端渲染的概念及优缺点

主流的web开发模式
1: 基于服务器端渲染的传统文本web开发模式, 前端耗时少,因为是服务器拼接渲染好数据, 有利于爬虫获得信息。但是占用资源, 不利于前后端分离,开发效率低
2: 前后端分离开发,
1.2:前后端分离的概念及优缺点

前后端分离开发:
1: 前端负责拿接口渲染数据, 后端只管api提供接口。减轻了服务器的压力。使用vue等框架,也好解决seo优化问题
1.3: 如何选择web开发模式

企业级网站, 使用服务器端渲染
后台管理项目, 交互性强, 使用前后端分离开发模式
但不是绝对的, 一些网站首屏是服务器端渲染, +其他页面前后端分离开发模式
2:session身份认证
2.1: 身份认证和Http协议无状态

通过一定的手段,完成对用户的认证
身份验证就是为了证明你是你自己
服务器端渲染用的是 session 认证机制
前后端分离推荐使用 JWT 认证机制
http无状态协议
每次的http协议是独立的,服务器不会主动权保留 每次http请求
服务器会会把认证信息存储在cookie中
3: Cookie身份认证
3.1:什么是cookie

cookie会自动发送, 域名独立, 有过期时限, 4KB限制。每次请求会把自己域名下未过期的cookie一起发送到服务器
3.2:cookie在身份认证中的作用

每次请求的时候, cookie会被存储在响应头中request header。
每个cookie都是对应Application中/cookies里面会有这些对应的属性, 如图所示
3.3:cookie不具有安全性

cookie也提供了读写cookie的API, 因此很容易被伪造。 不推荐将重要的隐私数据, 千万不能使用 cookie 存储且隐私的数据, 拨入用户的身份认证信息, 密码等
3.4:提高身份认证的安全性

客户端虽然有cookie,但是需要通过服务器端的cookie认证
4:session
4.1:session的工作原理

session的原理就是,
客户端发起请求---> 通过验证后 ----> 在服务器中开辟了内存,存储用户信息,染后将cookie个客户端
客户端的下次请求会携带服务器给的cookie---> 服务器从内存中根据cookie找到对应信息, 响应特定的内容给客户端
4.2:安装并配置express-session中间件

1: 初始化项目包管理文件
2: 安装express
3: 安装 express-session
4: 配置session中间件
4.3:express-session中间件的具体操作

session登录退出案例
A:app.js 接口配置:对应express-session配置session信息,将它挂载到全局中间件中,托管静态资源文件,解析post提交过来的表单户数 app.use(express.urlencode({extended: false}))
1: index首页只如果获取用户不成功,就弹出提示,并重定向到login登录页面, 反之有登录用户,就弹出提示,欢迎你
1.1:接口处理: 如果接口中没有session.islogin, 就将状态修改为1,表示登录不成功, 反之登录成功,就将状态值改为0, 并获取到sessions中的username,给页面去渲染提示信息
2:login登录页之登录请求, 表单提交事件, 发起post请求, 将表单序列化,如果登录成功就直接跳转到登录页面, 反之弹出提示登录失败
2.1:如果登录的用户名不是admin 并且 密码不是000000,就弹出提示登录失败,并把status改为1, 登录成功,就把获取到请求体的信息赋值给session.user, session.islogin = true表示登录成功, 向页面显示send登录成功
3:index首页退出功能:点击退出功能, 发起post请求, 如果退出成功,就重定向到登录页面
3.1:定义退出功能的接口, 接受到请求,就将session.destory给清空, 并向页面send显示退出成功
【注意post请求, 提交表单的时候,需要$(this).serialize序列化,接口处理数据需要app.use(express.urlencode({extends: false}))使用默认的格式处理表单数据】
【app.use全局挂载session, 登录之后,把表单的信息赋值给session,设置登录状态,
没有登录,通过判断页面中session.islogin如果没有,就设置为status=1,表示未登录,反之就是多了成功。
退出功能: 点击退出, 将session.destory给清空,向页面提示退出成功】
5: JWT认证机制 - 支持跨域
5.1:session认证的局限性以及jwt的概念

session 不支持跨域,需要做很多额外配置,才能实现跨域
不存在跨域问题就推荐session, 如果需要跨域就推荐使用JWT认证机制,是目前最流行的跨域解决方案
5.2:jwt的工作原理

JWT工作原理:客户端提交登录密码--->服务器验证,生成token字符串给客户端--> 浏览器将token存储在LocalStorage或者sessionStorage中,--->客户端再次请求用Authorization字段, 将token发给服务器---> 服务器还原token,还原成对象信息, 还原成功后针对用户响应特定的内容
5.3:jwt的三个组成部分以及各自代表的含义

JWT由header头部, payload有效荷载, signature签名,3部分组成,payload才是用户的真正信息, header和signature是为了保证token安全性
5.4:jwt的使用方式

客户端收到服务器返回的jwt之后, 会将它储存在localStorage或者sessionStorage中, 客户端以后去爱牛服务器都需要写到jwt这个字符串, 推荐的做法是将jwt写在http的Authorization中,
6:JWT在项目中的使用
6.1:jwt的使用流程分析

jwt实际应用一
流程图分析
1: 安装jwt相关包: jsonwentoken生成jwt字符串, express-jwt还原成json对象
2:导入相关包
3: 定义secret秘钥;
4:登录成功后,生成jwt字符串
5:将jwt字符串还原为json对象
6:使用req.user获取用户信息
7:捕获解析jwt失败后产生的错误
6.2:JWT在项目中的具体使用

jwt实际应用二
代码分析
0: 创建web服务器
1:导入2个包:jsonwentoken生成jwt字符串, express-jwt还原成json对象
2:定义secret秘钥;【这个秘钥会被jsonwenttoken生成token】,登录后就会使用jwt生成这个token
3:登录请求,根据代码中的用户,如果不是自己的用户就在body中提示失败, 正确就用jwt方法,就将请求体中的用户名和秘钥,设置过期时间,数据响应成功,就在body中响应数据。可以看出token已经被加密了
4:全局挂载解密方法: 将请求地址中带/api/的接口,把秘钥进行解密。之后不带api接口的请求,就能使用req.user将用户信息解密到body的data中
5:请求登录后的用户信息, postman通过接口携带了token, 成功在body中响应了成功的数据
6:创建一个全局错误错误中间件, 捕获到err错误信息, 要不查询一但报错,就会崩溃,这样捕获了错误信息, 就能将错误信息直接响应到body中
6.3:使用JWT生成token后用postman测试接口请求

jwt实际应用三
postman接口测试和服务器终端响应
1: post请求登录请求, 用代码红章的用户进行的了,成功后会生成一个token在body中
2: 获取用户信息是, 需要将Authorization: Bearer token携带,才能成功访问数据, iat和exp会token的有效时间
3:因为token是30秒过期, 所以过期后,刷新页面重新会崩溃,为了防止程序崩溃,在代码中捕获错误信息, 将错误信息,打印到body中, 这样程序会再次运行, 但是body中能看到还是报错的:无效的token
谢谢您的阅读,后端-Node系列暂时完结!