前のセクションでは、バックエンドがデータをトークンに暗号化する方法とユーザーデータに復号化する方法を学びましたが、ユーザーがログインせずにインターフェース(ユーザー情報を必要とするAPI)をリクエストできないことは保証されていないため、制御しないと、直接リクエストするとエラーが報告されますが、セキュリティのため、コントロールを呼び出す前にほとんどのインターフェースにログインする必要があります。ここでは、ミドルウェアを使用して制御します。
utilsフォルダーに新しいwhiteList.jsファイルを作成する
ログインなしのインターフェースルートを次に示します。これらは、クライアントからログイン状態トークンが渡されなくても正常に呼び出すことができるルートです。後でログインせずにインターフェースを呼び出す必要がある場合は、この配列の背後に複数のインターフェースルートを直接追加できます。
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: '用户未登录'
}
}
}
})
このようにして、クライアントがインターフェースを呼び出すと、このフィルタリング層を通過します。トークン検証が不要なのは、ホワイトリスト内のインターフェースのみです。そうでない場合は、redisキーと値のペアと比較する必要があります。レコードを見つけて、キーの有効期限が切れていません。実行されると、次のステップが実行されます。実行されない場合は、インターセプトされ、ステータスコード20001が直接返されます。
前:トークン検証ログインステータス
次:書き込まれます...