天天看点

[记录四]Vue+node+koa2+mysql+nginx+redis,全栈开发小程序和管理员管理系统项目——token控制接口权限

上节我们已了解后端是如何将数据加密成token以及如何解密回用户数据的,但是并没有做到用户没有登录就不可以请求某个接口(需要用户信息的api),这样不控制的话就直接请求那就会报错了,当然为了安全是肯定要对大部分接口进行登录后才能调用的控制的。这里我采用中间件去控制。

在utils文件夹下新建一个whiteList.js文件

这里就写免登录的接口路由,这些是客户端不传登录态token也是可以调用成功了,后面需要不登录就能调用接口就直接在这个数组后面加多个接口的路由。

[记录四]Vue+node+koa2+mysql+nginx+redis,全栈开发小程序和管理员管理系统项目——token控制接口权限

在app.js中编写一个中间件,根据上面的白名单进行接口控制。

const redisClient = require('./redis/redis')
const whiteList = require('./util/whiteList')
//app.js
//接口是否需要登录
app.use(async (ctx, next) => {
  let url = ctx.request.url
  let flag = false
  whiteList.map(res => { 
    if (url.indexOf(res) !== -1) { 
      flag = true
    }
  })
  if (flag) {
    await next()
  } else { 
    if (ctx.header && ctx.header.token) {
      const token = ctx.header.token
      if (token) {
        try {
          let exits = await redisClient.exists(token)
          if (exits) {//redis存在此token
            await next()
          } else {
            return ctx.body = {
              code: 20001,
              status: 200,
              message: 'token失效,请重新登录'
            }
          }
        } catch (error) {
          console.log('我是错误信息')
          console.log(error)
          console.log('我是错误信息')
        }
      } else {//没有传token
        return ctx.body = {
          code: 20001,
          status: 200,
          message: '用户未登录'
        }
      }
    } else {
      return ctx.body = {
        code: 20001,
        status: 200,
        message: '用户未登录'
      }
    }
  }
})

           

这样客户端调用接口的时候都会经过这一层的筛选,只有在白名单内的接口才不需要token的校验,不在的话需要跟redis的键值对去对比,找到记录并key未过期代表可以执行,就会执行下一步,否则都将拦截下来直接返回20001的状态码。

上一篇:token校验登录态

下一篇: 使用Swagger自动生成接口文档

继续阅读