门户网站建设重建方案,wordpress采集源码,美发营销型网站,西安网站建设新闻Node.jsWeb开发模式如何选择Web开发模式身份认证什么是身份认证为什么要身份认证不同开发模式的身份认证Session认证机制提高身份认证的安全性Session的工作原理Express中使用Session认证Session认证机制的局限性JWT认证机制JWT的工作原理JWT的组成部分Express中使用JWT在登录成…
Node.jsWeb开发模式如何选择Web开发模式身份认证什么是身份认证为什么要身份认证不同开发模式的身份认证Session认证机制提高身份认证的安全性Session的工作原理Express中使用Session认证Session认证机制的局限性JWT认证机制JWT的工作原理JWT的组成部分Express中使用JWT在登录成功后生成JWT字符串将JWT字符串还原为JSON对象通过req.user对象来访问从JWT字符串中解析出来的用户信息捕获解析JWT失败后的产生的错误Web开发模式 基于服务器渲染的传统web开发模式 服务端渲染的概念服务器发送给客户端的HTNL页面是在服务器通过字符串的拼接动态生成的因此客户端不需要Ajax这样的技术额外请求页面的数据 优点 前端耗时少有利于seo就是爬虫更容易爬取获得信息更有利于seo 缺点 占用服务端资源请求过多会对服务器造成压力不利于前后端分离开发效率低
//服务器通过字符串的拼接,发送给前端
app.get(/user, function (req, res) {const user {name:乞力马扎罗,age:24}// res.send()方法可以把处理好的json内容发送给客户端res.send(h1姓名:${user.name},年龄${user.age})
})基于前后端分离渲染的新型web开发模式 前后端分离二点开发模式依赖于Ajax技术的广泛应用就是后端只负责提供api接口前端调用Ajax接口的开发模式 优点 开发体验好前端专注于UI页面后端专注于Api的开发用户体验好Ajax可以轻松实现页面的局部刷新减轻了服务器端的渲染压力 缺点 不利于SEO因为完整的HTML页面需要在客户端动态拼接完成所以爬虫无法提取页面的有效信息解决方案利用vueReact等前端的SSR技术能够很好的解决该问题
如何选择Web开发模式
比如企业级网站主要功能是展示而没有复杂的交互并且需要良好的SEO这时就需要使用服务端渲染类似后台管理项目交互性强不需要考虑seo,那么就可以使用前后端分离的开发模式当然有时候为了兼顾首页的渲染速度和前后端分离的开发效率一些网站采用首屏服务器渲染其他页面前后端分离的开发模式
身份认证
什么是身份认证
身份认证又称身份验证鉴权是指通过一定的手段完成对用户身份的确认web开发中涉及到用户身份的认证。例如各大网站的手机验证码登录邮箱密码登录二维码登录
为什么要身份认证
身份认证的目的是为了确认当前所声称为某种身份的用户确实是所声称的用户、类似取快递的时候拿出你的取件码或手机尾号
不同开发模式的身份认证 基于服务器渲染和前后端分离的两种开发模式分别有不同的身份认证方案 服务端渲染推荐使用Session认证机制前后端分离推荐使用JWT认证机制
Session认证机制 了解HTTP协议的无状态性指的是客户端的每次http请求都是独立的连续多个请求之间没有直接的关系服务器不会主动保留每次HTTP请求的状态 类似超市收银员记不住每个来结算的客户是否是VIP 如何突破HTTP的无状态的限制客户端在登录成功的时候服务器给客户端颁发一个登录成功的标识这样客户端第二次登录的时候就可以携带这个标识Cookie来告诉服务器我之前登录过 类似超市为客户办理会员卡收银员通过会员卡来确认客户是否是VIP 现实生活中的会员卡身份认证方式在web开发中的专业术语叫做Cookie 什么是Cookie1Cookie是存储在用户游览器中的一般不超过4kb的字符串它由一个名称Name一个值Value和其他几个用于控制Cookie有效期安全性使用范围的可选属性组成 2不同域名下的Cookie各自独立每当客户端发起请求会自动把当前域名下所有未过期的Cookie一同发送到服务器 Cookie的几大特性自动发送随着请求自动发送 域名独立百度不能访问淘宝下的cookie 过期时限每个cookie都有有效期过了就不会再发送了 4kb限制每个cookie不能超过4kb Cookie在身份认证中的作用1客户端第一次请求服务器的时候服务器通过响应头的形式向客户端发送一个身份认证的Cookie 2客户端会自动将Cookie保存在游览器中 3随后客户端游览器每次请求服务器的时候游览器会自动将身份认证相关的所有Cookie通过请求头的形式发送给服务器 4服务器即可验明客户端的身份 Cookie不具有安全性因为Cookie是存储在游览器中而且游览器也提供了读写cookie的API因此Cookie很容易被伪造不具有安全性 因此不建议服务器将重要的隐私数据通过cookie的形式发送给游览器 所以千万不要使用Cookie存储重要且隐私的数据比如用户的身份信息密码 提高身份认证的安全性
类似为了防止客户伪造会员卡收银员在拿到客户出示的会员卡之后可以在收银机上进行刷卡认证只有收银机确认存在的会员卡才可以被正常使用也就是会员卡刷卡认证‘会员卡刷卡认证’ 的 这种理念就是Session的认证机制的精髓
Session的工作原理 Express中使用Session认证
安装Express-session中间件npm i express-session 在Express项目中只需要安装中间件即可在项目中使用Session认证 配置express-session中间件 express-session中间件安装成功后需要通过app.use()来注册session中间件 //express-session中间件
//导入session中间件
const session require(express-session)
//注册session
app.use(session({secret: key, //值负责对session加密resave: false, //固定写法saveUninitialized: true, //固定写法
}))向session中存数据 配置成功后即可通过req.session来访问和使用session对象从而存储用户的关键信息只有配置了express-session这个中间件才能通过req点出来session这个属性如果post请求配置这个app.use(express.urlencoded({extended:false}))不然post请求是空 //express-session中间件
//导入session中间件
const session require(express-session)
// 导入express
const express require(express)
// 创建web服务器
const app express()
// 启动文本服务器
app.listen(80,(){console.log(80服务器启动)
})
//注册session
app.use(session({secret: key, //值负责对session加密resave: false, //固定写法saveUninitialized: true, //固定写法
}))
//配置这个不然post请求是空
app.post(/login, (req, res) {if (req.body.name ! 乞力马扎罗 || req.body.password ! 111111) {return res.send({status: 0,msg: 登录失败})}//只有配置了express-session这个中间件才能通过req点出来session这个属性//通过 req.session追加任何属性req.session.user req.bodyreq.session.islogin trueres.send({status: 1,msg: 登录成功})
})
向session中取数据
//向session中取数据
app.post(/getuserinfo, (req, res) {console.log(req.session.user)// 判断用户是否登录if (!req.session.islogin) {res.send({status: 0,msg: 请登录})return}res.send({status:1, data:req.session.user})
})清空session 调用req.session.destroy()函数即可清空服务器保存的session信息·只会清空调用这个的当前用户的session信息而不是清空所有的session信息调用场景退出登录 app.post(/outlogin, (req, res) {req.session.destroy()res.send({status:1, msg:退出成功})
})Session认证机制的局限性
session认证机制需要配合Cookie才能实现由于cookie默认不支持跨域访问所以当涉及到前端跨域请求后端接口的时候需要做很多额外的配置才能实现跨域session认证注意当前端请求后端接口不存在跨域问题的时候推荐使用session身份认证机制当前端需要跨域请求后端接口的时候不推荐使用Seesion身份认证机制推荐使用JWT认证机制
JWT认证机制 JWT,全称JSON Web Token,是目前最流行的跨域认证解决方案 JWT的工作原理 JWT的组成部分
JWT通常由三部分组成分别是Header头部Payload有效荷载Signature签名三者之间由英文的.连接格式Header.Payload.SignaturePayload部分才是真正的用户信息它是用户信息经过加密之后生成的字符串Header部分和Signature部分是安全性相关的部分只是为了保证token的安全性以/api开头的请求路径不需要访问权限以/my开头的请求路径需要在请求头中携带Authorization身份认证才能正常访问成功
Authorization: Bearer tokenExpress中使用JWT
安装JWT相关的包
npm install jsonwebtoken express-jwtjsonwebtoken 用于生成JWT字符串express-jwt用于将JWT字符串解析还原成JSON对象导入包
const jwt require(jsonwebtoken)
const expressjwt require(express-jwt)定义secret秘钥 为了保证JWT字符串的安全性防止JWT在网路传输错过成中被别人破解我们需要专门定义一个用于加密和解密的Secert秘钥当生成JWT字符串的时候需要使用secret秘钥对用户的信息进行加密最终等到加密好的JWT字符串当把JWT字符串解析还原成JSON对象的时候需要serect秘钥进行解密
在登录成功后生成JWT字符串
const jwt require(jsonwebtoken)
const {expressjwt} require(express-jwt)
//定义secret秘钥
const secretKeyadminpossword
app.post(/jwtlogin, (req, res) {let userreq.bodyif (req.body.name ! 乞力马扎罗 || req.body.password ! 111111) {return res.send({status: 0,msg: 登录失败})}//调用jwt.sign()生成JWT字符串三个参数分别是用户信息对象加密秘钥配置对象expiresIn代表token有效期res.send({status: 1,msg: 登录成功,token:jwt.sign(user,secretKey,{expiresIn:30s})})
})将JWT字符串还原为JSON对象
客户端每次在访问哪些有权限接口的时候都需要主动通过请求头中的AUthirization字段将token字符串发送到服务器进行身份验证此时服务器通过express.Jwt这个中间件自动将客户端发送过来的token解析还原成JSON对象
// 1,使用app.use()注册
// 2expressjwt({secret:secretKey})就是用来解析的中间件
// 3.unless({path:[/^\/api\//]})用来指定哪些接口不需要访问权限
//4,algorithms:[HS256]必写
// 配置过 express-jwt 可通过 req.auth 获取token信息
app.use(expressjwt({ secret: secretKey, algorithms: [HS256] }).unless({ path: [/^\/api\//]}))
通过req.user对象来访问从JWT字符串中解析出来的用户信息
配置请求头Authorization:Bearer空格登录后的token访问前一定得全局配置上面的app.use(expressjwt({ secret: secretKey, algorithms: [“HS256”] }).unless({ path: [/^/api//]}))
app.post(/getuser, (req, res) {console.log(req.user) res.send({status: 1,msg: 成功,data:req.auth})
}) 捕获解析JWT失败后的产生的错误
检验token过期或者不合法通过express错误中间件捕获到这个问题错误中间件需放置在所有路由之后
//错误中间件
app.use((err, req, res, next) {console.log(err)if (err.name UnauthorizedError) {return res.send({status: 401,message: 无效token})}res.send({status: 500,message: 未知错误})
})