不同开发模式下的身份认证
- 服务端渲染推荐使用 Session 认证机制
- 前后端分离推荐使用 JWT 认证机制
cokkie 认识
解析:超市收银员 给你 颁发 会员卡 之后 出示 会员卡 的过程 类似 cookie
在首次 登录成功后 服务端 颁发 cookie
- cookie 是存储在 用户 浏览器中的 字符串
- 域名独立
- 过期时限
- 4kb限制
Cookie在身份认证中的作用
描述:
- 当客户端第一次请求服务器 , 服务器通过响应头(Response Headers) 向客户端发送Cookie ,客户端会将Cookie保存在浏览器中
- 当客户端 每一次请求 浏览器 , 浏览器自动携带cookie ,通过请求头(Request Headers)发送给服务器 ,验证身份
提高 身份认证的安全性
Session认证机制 和工作原理
在Express中 使用 Session认证
安装 express-session 中间件
配置 express-session 通过 app.use()
const session= require('express-session')
app.use(session({
secret:'ztlovety', // secret 属性可以为任意字符串
resave:false,
saveUninitialized:true //保存未初始化
}))
向sessoin 中存 数据
当express-session 中间件配置成功后 通过 req.session 来访问 使用session 存储用户信息
app.post('/api/login', (req, res) => {
// 判断用户提交的登录信息是否正确
if (req.body.username !== 'admin' || req.body.password !== '000000') {
return res.send({ status: 1, msg: '登录失败' })
}
// TODO_02:请将登录成功后的用户信息,保存到 Session 中
req.session.user=req.body //讲用户信息。存储到Session中
req.session.islogin = true //讲用户登录状态 存储到 Session中
res.send({ status: 0, msg: '登录成功' })
})
从session 中取数据
app.get('/api/username', (req, res) => {
// TODO_03:请从 Session 中获取用户的名称,响应给客户端
if(!req.session.islogin) {
return res.send({status:1,msg:'fail'})
}
res.send({
status:0,
msg:'success',
username:req.session.user.username
})
})
清空session
app.post('/api/logout', (req, res) => {
// TODO_04:清空 Session 信息
req.session.destroy()
res.send({
status:0,
msg:'退出登录成功'
})
})
JWT 认证机制
-
了解 Session 认证的局限性
总结:
不跨域 用 session 认证
跨域 用 JWT 认证
JWT工作原理
session :数据 存储在 服务器端
token : 数据存储在 客户端
JWT 组成 部分
JWT 分别由 Header , Payload,Signature 组成 之间用 ‘ . ’
用户信息 将 加密 存储在 Payload 部分
JWT 的使用方式
客户端收到 服务器 返回的JWT 之后 ,本地存储后
每次,发起请求时,都会携带 JWT 字符串 推荐讲 JWT 放在HTTP 请求头中的 Authorization(授权)中
Authorization:Bearer <token>
使用JWT
安装JWT 相关的包
npm install jsonwebtoken express-jwt
- jsonwebtoken 用于 生成JWT 字符串
- express-jwt 用于将 JWT字符串 解析 还原成 JSON 对象 //将客户端 发送的JWT 在后台服务器解析 JSON
导入 JWT 相关的包
const jwt =require('jsonwebtoken')
const expressJWT = require('express-jwt')
定义secret 密钥
const secretKey = 'ztyyds no1'
secret 密钥 本质 就是 一个字符串
在登录成功后生成 JWT字符串
调用 jsonwebtoekn 包 提供的 , 讲用户的信息 加密 成 JWT 字符串 响应给客户端
// 调用 jwt.sign() 生成 JWT 字符串 三个参数 分别是 用户信息对象,加密密钥,配置对象
token: jwt.sign({username:userinfo.username}, secretKey, {expiresIn:'30s'})
JWT 字符串 还原为JSON 对象
app.use(expressJWT({secret:secretKey}).unless({path:[/^\/api\//]}))
使用 req.user 获取用户信息
当 express.jwt 这个中间件配置 成功后 在有权限的接口中 使用req.user 对象 来访问JWT字符串中解析出来的用户信息
jwt-捕获解析 jwt 失败产生的错误`
app.use((err,req,res,next) =>{
if(err.name === 'UnauthorizedError'){
return res.send({
status:401,
message:'无效的token'
})
}
res.send({
status:401,
message:'未知的错误'
})
})