mirror of
https://github.com/ZeroCatDev/ClassworksKV.git
synced 2025-10-22 02:03:11 +00:00
54 lines
1.4 KiB
JavaScript
54 lines
1.4 KiB
JavaScript
/**
|
||
* 纯账户JWT认证中间件
|
||
*
|
||
* 只验证账户JWT是否正确,不需要设备上下文
|
||
* 适用于只需要账户验证的接口
|
||
*/
|
||
|
||
import { verifyToken } from "../utils/jwt.js";
|
||
import { PrismaClient } from "@prisma/client";
|
||
import errors from "../utils/errors.js";
|
||
|
||
const prisma = new PrismaClient();
|
||
|
||
/**
|
||
* 纯JWT认证中间件
|
||
* 只验证Bearer token并将账户信息存储到res.locals
|
||
*/
|
||
export const jwtAuth = async (req, res, next) => {
|
||
try {
|
||
const authHeader = req.headers.authorization;
|
||
|
||
if (!authHeader || !authHeader.startsWith("Bearer ")) {
|
||
return next(errors.createError(401, "需要提供有效的JWT token"));
|
||
}
|
||
|
||
const token = authHeader.substring(7);
|
||
|
||
// 验证JWT token
|
||
const decoded = verifyToken(token);
|
||
|
||
// 从数据库获取账户信息
|
||
const account = await prisma.account.findUnique({
|
||
where: { id: decoded.accountId },
|
||
});
|
||
|
||
if (!account) {
|
||
return next(errors.createError(401, "账户不存在"));
|
||
}
|
||
|
||
// 将账户信息存储到res.locals
|
||
res.locals.account = account;
|
||
next();
|
||
} catch (error) {
|
||
if (error.name === 'JsonWebTokenError') {
|
||
return next(errors.createError(401, "无效的JWT token"));
|
||
}
|
||
|
||
if (error.name === 'TokenExpiredError') {
|
||
return next(errors.createError(401, "JWT token已过期"));
|
||
}
|
||
|
||
return next(errors.createError(500, "认证过程出错"));
|
||
}
|
||
}; |