JWT-鉴权

什么是JWT

  • JSON Web Token(简称 JWT)是目前最流行的跨域认证解决方案。
    是一种认证授权机制。
  • 三个组成部分:HEADER头部,PAYLOAD载荷(数据username、ID等),VERIFT SIGNATURE签名
  • 将客户端的内容进行加密,当每次发请求时,加上token,发给服务器,服务器再进行解密
  • 数据存在客户端

JWT原理

在这里插入图片描述

JWT认证流程
  • 用户输入用户名/密码登录,服务端认证成功后,会返回给客户端一个 JWT
  • 客户端将 token 保存到本地(通常使用 localstorage,也可以使用 cookie)
  • 当用户希望访问一个受保护的路由或者资源的时候,需要请求头的 Authorization 字段中使用Bearer 模式添加 JWK.

JWT生成

jwt.io/.
www.jsonwebtoken.io/.

JWT使用方式

生成token:
 useCtrl.js:
  // 登录
  async login(ctx){
    // 校验参数
    ctx.verifyParams({
      username: {type: 'string', required: true},
      password: {type: 'password', required: true}
    });
    // 用户名密码是否正确
    const {username, password} = ctx.request.body;
    const user = await User.findOne({username, password});
    console.log(user);
    if(!user){
      ctx.throw(401, '用户名或密码错误');
    }else{
     //登录成功

    // 生成token
    const token = jwt.sign({ _id: user._id, username: user.username }, secret, { expiresIn: '15d'});
      // 将token告诉客户端
      ctx.body = { token };
    }
  };

解密:
法一:自定义解密
useCtrl.js:
 async auth(ctx, next){
    // 校验用户身份
    let token = ctx.request.header['authorization'];
    token = token.replace('Bearer ', '');
    // 解密jwt
    const result = jwt.verify(token, secret); 
    ctx.state = result;
    await next();
  };

router/user.js:
  //法一:自定义解密,要配合userctrl使用
  router.patch('/:id', userCtrl.auth, userCtrl.update);
法二:用插件(koaJWT)
router/user.js:
  //插件解密
  const koaJWT = require('koa-jwt');
  const {secret} = require('../config');
  const auth = koaJWT({secret});
  //法二:用插件解密
  router.patch('/:id', auth, userCtrl.update);
  • 19
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值