首页 > 语言 > JavaScript > 正文

koa2服务端使用jwt进行鉴权及路由权限分发的流程分析

2024-05-06 15:36:45
字体:
来源:转载
供稿:网友

大体思路

  后端书写REST api时,有一些api是非常敏感的,比如获取用户个人信息,查看所有用户列表,修改密码等。如果不对这些api进行保护,那么别人就可以很容易地获取并调用这些 api 进行操作。

  所以对于一些api,在调用之前,我们在服务端必须先对操作者进行“身份认证”,这就是所谓的鉴权。

  Json Web Token 简称为 JWT,它定义了一种通信双方之间以 JSON 对象的形式安全传递信息的方法。JWT 可以使用 HMAC 算法或者是 RSA 的公钥密钥对进行签名,复杂度较高,换来的是更可靠的安全系数。

  整个认证的流程大体如下:

  首先用户登录的接口是不用token认证的,因为这个接口本身就是token的产生来源。前端输入用户名和密码后请求服务器登录接口,服务器验证用户名密码正确后,生成token并返回给前端,前端存储token,并在后面的请求中把token带在请求头中传给服务器,服务器验证token有效,才可以进行下一步操作。

服务器生成token

  由于我们的服务端使用 Koa2 框架进行开发,除了要使用到 jsonwebtoken 库之外,还要使用一个 koa-jwt 中间件,该中间件针对 Koa 对 jsonwebtoken 进行了封装,使用起来更加方便。

 const router = require('koa-router')();const jwt = require('jsonwebtoken');const userModel = require('../models/userModel.js');router.post('/login', async (ctx) => { const data = ctx.request.body;const result = await userModel.findOne({  name: data.name,  password: data.password }) if(result !== null){  const token = jwt.sign({   name: result.name,   _id: result._id  }, 'zhangnan', { expiresIn: '2h' });  return ctx.body = {   code: 200,   token: token,   msg: '登录成功'  } }else{  return ctx.body = {   code: 400,   token: null,   msg: '用户名或密码错误'  } }});module.exports = router;

  (注意:这里暂时不讨论加盐加密校验,实际项目中密码不可能这样明文验证,这里只是为了着重讨论token鉴权。在验证了用户名密码正确之后,就可以调用 jsonwebtoken 的 sign() 方法来生成token,接收三个参数,第一个是载荷,用于编码后存储在 token 中的数据,也是验证 token 后可以拿到的数据;第二个是密钥,自己定义的,随便写个什么单词都可以,但是验证的时候一定要相同的密钥才能解码;第三个是options,可以设置 token 的过期时间。)

前端获取token

  接下来就是前端获取 token,这里是在 vue.js 中使用 axios 进行请求,请求成功之后拿到 token 保存到 localStorage 中。

submit(){ axios.post('/login', {  name: this.username,  password: this.password }).then(res => {  if(res.code === 200){   localStorage.setItem('token', res.data.token);  }else{   this.$message('登录失败')  } })}            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选