Files

52 lines
1.6 KiB
JavaScript

import { apiPrefix } from '../config/index.js'
import { verifyAuthSync, enumLoginCode } from '../utils/verify-auth.js'
let whitePath = [
'/login',
'/get-pub-pem'
].map(item => (apiPrefix + item))
logger.warn('路由白名单:', whitePath)
const useAuth = async (ctx, next) => {
const { request, res, cookies } = ctx
const { path, headers } = request
if (whitePath.includes(path)) {
logger.info('白名单路由: ', path)
return await next()
}
logger.info('验证权限路由: ', path)
const { token } = headers
if (!token) return res.fail({ msg: '未登录(token)', status: 401 })
const session = cookies.get('session')
if (!session) return res.fail({ msg: '未登录(session)', status: 401 })
// 验证token
const { code } = await verifyAuthSync(token, session)
let failMsg = ''
switch (code) {
case enumLoginCode.SUCCESS:
return await next()
case enumLoginCode.EXPIRES:
failMsg = 'TOKEN已过期, 请重新登录'
break
case enumLoginCode.SID_EXPIRES:
failMsg = 'SESSION过期, 请重新登录'
break
case enumLoginCode.ERROR_TOKEN:
failMsg = 'TOKEN校验失败, 请重新登录'
break
case enumLoginCode.REVOKED_TOKEN:
failMsg = 'TOKEN已被注销, 请重新登录'
break
case enumLoginCode.ERROR_UID:
logger.error('用户id校验失败(可能存在外部攻击): ', path)
failMsg = 'UID错误!!!'
break
}
logger.warn('验证失败: ', code, failMsg)
return res.fail({ msg: failMsg || '身份验证失败(未知错误!)', status: 403 })
}
export default useAuth