JWT实现加密用户信息及信息验证

传送门

一、什么是JWT

  • JWT —— json web token
  • 用户认证成功之后,server 端返回一个加密的token给客户端
  • 客户端后续每次请求都带 token ,以示当前的用户身份

二、搭建环境(koa2 环境)

npm install koa-generator -g

koa2 -e koa2-jwt-code

cd koa2-jwt-code

npm install

在这里插入图片描述

三、编写测试路由

//模拟登录
router.prefix('/users')
router.post('/login', async (ctx, next) => {
  const { username, password } = ctx.request.body

  let userInfo
  if (username === 'zhangsan' && password === '123') {
    userInfo = {
      userId: 1,
      userName: 'zhangsan',
      password: '123',
      nickName: '张三'
    }
   }
    if (userInfo == null) {
      ctx.body ={
        errno: -1,
        msg:"登录失败"
      }
      return
    }
    ctx.body = {
      errno: 0,
      userInfo
    }
  
})

在这里插入图片描述

四、对返回的用户信息进行加密

  • 安装插件

npm i koa-jwt --save (对是否为当前用户进行验证)

npm i jsonwebtoken --save (对返回信息进行加密)

  • 配置插件
// app.js

const jwtKoa = require('koa-jwt')
app.use(jwtKoa(
  {
    secret:'1Hrj$_enferk' //密钥

  }
).unless({
  path:[/^\/users\/login/] //自定义哪些目录忽略 JWT 验证
}))

注:如果目录下使用 JWT 验证,每次访问该目录下的路由是需要携带 token 信息(即加密信息)才能访问该路由。

//对信息进行加密
const jwt = require('jsonwebtoken')
token = jwt.sign(userInfo, '1Hrj$_enferk',{expiresIn: '1h'})

在这里插入图片描述

五、服务端获取用户信息并解密信息

const until = require('util')
const verify = until.promisify(jwt.verify)

router.get('/getUserInfo', async (ctx, next) => {
  const token = ctx.header.authorization
  try {
    const payload = await verify(token.split(' ')[1], '1Hrj$_enferk')
    ctx.body = {
      errno:0,
      userInfo: payload
    }
  } catch (ex) {
    ctx.body = {
      errno:-1,
      msg:'失败'
    }
  }
})

在这里插入图片描述

六、JWT vs Session

共同点:为了解决:登录和存储登录用户信息
不同点:

  • JWT 用户信息加密存储在客户端,不依赖 cookie ,可跨域
  • session 用户信息存储在服务端,依赖于 cookie,默认不可跨域

JWT 的优点:

  • 将加密信息存放在客户端,减少服务端的内存压力。
  • 不依赖于 cookie 可以将信息进行跨域分享。

JWT的不足:

  • 服务端无法控制信息,一旦用户修改信息后,服务端无法第一时间修改加密信息。

Session的优点:

  • 可以对用户信息进行控制。

Session的不足:

  • 存储要依赖于 redis 和 cookie ,并且不能跨域。
  • 一旦上线启动多进程,而不依赖 redis 是无法实现多进程之间的信息共享。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海面有风

您的鼓励将是我前进的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值