86 lines
3.1 KiB
JavaScript
86 lines
3.1 KiB
JavaScript
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.verifySupabaseToken = exports.generateToken = exports.authMiddleware = void 0;
|
|
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
const config_1 = __importDefault(require("../config"));
|
|
const supabase_1 = __importDefault(require("../utils/supabase"));
|
|
// Middleware to verify JWT token
|
|
const authMiddleware = async (c, next) => {
|
|
try {
|
|
// Get authorization header
|
|
const authHeader = c.req.header('Authorization');
|
|
if (!authHeader || !authHeader.startsWith('Bearer ')) {
|
|
return c.json({ error: 'Unauthorized: No token provided' }, 401);
|
|
}
|
|
// Extract token
|
|
const token = authHeader.split(' ')[1];
|
|
try {
|
|
// 验证 JWT token
|
|
const decoded = jsonwebtoken_1.default.verify(token, config_1.default.jwt.secret);
|
|
// 特殊处理 Swagger 测试 token
|
|
if (decoded.sub === 'swagger-test-user' && decoded.email === 'swagger@test.com') {
|
|
// 为 Swagger 测试设置一个模拟用户
|
|
c.set('user', {
|
|
id: 'swagger-test-user',
|
|
email: 'swagger@test.com',
|
|
name: 'Swagger Test User'
|
|
});
|
|
// 继续到下一个中间件或路由处理器
|
|
await next();
|
|
return;
|
|
}
|
|
// 设置用户信息到上下文
|
|
c.set('user', {
|
|
id: decoded.sub,
|
|
email: decoded.email
|
|
});
|
|
// 继续到下一个中间件或路由处理器
|
|
await next();
|
|
}
|
|
catch (jwtError) {
|
|
if (jwtError instanceof jsonwebtoken_1.default.JsonWebTokenError) {
|
|
return c.json({ error: 'Unauthorized: Invalid token' }, 401);
|
|
}
|
|
if (jwtError instanceof jsonwebtoken_1.default.TokenExpiredError) {
|
|
return c.json({ error: 'Unauthorized: Token expired' }, 401);
|
|
}
|
|
throw jwtError;
|
|
}
|
|
}
|
|
catch (error) {
|
|
console.error('Auth middleware error:', error);
|
|
return c.json({ error: 'Internal server error' }, 500);
|
|
}
|
|
};
|
|
exports.authMiddleware = authMiddleware;
|
|
// Generate JWT token
|
|
const generateToken = (userId, email) => {
|
|
const secret = config_1.default.jwt.secret;
|
|
const expiresIn = config_1.default.jwt.expiresIn;
|
|
return jsonwebtoken_1.default.sign({
|
|
sub: userId,
|
|
email,
|
|
}, secret, {
|
|
expiresIn,
|
|
});
|
|
};
|
|
exports.generateToken = generateToken;
|
|
// Verify Supabase token
|
|
const verifySupabaseToken = async (token) => {
|
|
try {
|
|
const { data, error } = await supabase_1.default.auth.getUser(token);
|
|
if (error || !data.user) {
|
|
return null;
|
|
}
|
|
return data.user;
|
|
}
|
|
catch (error) {
|
|
console.error('Supabase token verification error:', error);
|
|
return null;
|
|
}
|
|
};
|
|
exports.verifySupabaseToken = verifySupabaseToken;
|