前后端身份验证

1,074 阅读3分钟

不同开发模式下的身份认证

  1. 服务端渲染推荐使用 Session 认证机制
  2. 前后端分离推荐使用 JWT 认证机制

cokkie 认识

image.png

解析:超市收银员 给你 颁发 会员卡 之后 出示 会员卡 的过程 类似 cookie

在首次 登录成功后 服务端 颁发 cookie

image.png

  1. cookie存储用户 浏览器中的 字符串
  2. 域名独立
  3. 过期时限
  4. 4kb限制

Cookie在身份认证中的作用

image.png

描述:

  1. 当客户端第一次请求服务器 , 服务器通过响应头(Response Headers) 向客户端发送Cookie ,客户端会将Cookie保存在浏览器中
  2. 当客户端 每一次请求 浏览器 , 浏览器自动携带cookie ,通过请求头(Request Headers)发送给服务器 ,验证身份

提高 身份认证的安全性

image.png

Session认证机制 和工作原理

image.png

在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 认证机制

  1. 了解 Session 认证的局限性

image.png

image.png

总结:

不跨域 用 session 认证

跨域 用 JWT 认证

JWT工作原理

image.png

session :数据 存储在 服务器端

token : 数据存储在 客户端

JWT 组成 部分

image.png

JWT 分别由 Header , Payload,Signature 组成 之间用 ‘ . ’

image.png

用户信息 将 加密 存储在 Payload 部分

JWT 的使用方式

image.png

客户端收到 服务器 返回的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 密钥

image.png

 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:'未知的错误'
 })
  })