上節我們已了解后端是如何將資料加密成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自動生成介面檔案
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/136505.html
標籤:其他
