[記錄四]Vue+node+koa2+mysql+nginx+redis,全棧開發小程式和管理員管理系統專案——token控制介面許可權

2020-09-28 13:00:47

上節我們已瞭解後端是如何將資料加密成token以及如何解密回使用者資料的,但是並沒有做到使用者沒有登入就不可以請求某個介面(需要使用者資訊的api),這樣不控制的話就直接請求那就會報錯了,當然為了安全是肯定要對大部分介面進行登入後才能呼叫的控制的。這裡我採用中介軟體去控制。

在utils資料夾下新建一個whiteList.js檔案

這裡就寫免登入的介面路由,這些是使用者端不傳登入態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自動生成介面檔案