clouddisk-project/backend/src/routes/auth.js
Team f339513be8 团队工作进展:
- UI设计: 文件列表页 Draw.io 设计稿
- 架构: 数据库设计文档
- 后端: 用户认证接口实现 (login/register)

待完成:
- 前端 Electron 主进程开发
- 文件管理 API 开发
- 测试用例编写
2026-03-10 07:24:38 +00:00

87 lines
2.6 KiB
JavaScript

const express = require('express');
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
const db = require('../db');
const router = express.Router();
const JWT_SECRET = process.env.JWT_SECRET || 'clouddisk-secret-key';
// Register
router.post('/register', async (req, res) => {
try {
const { username, password, email } = req.body;
// Check if user exists
const existingUser = db.query('SELECT id FROM users WHERE username = ?', [username]);
if (existingUser.length > 0) {
return res.status(400).json({ error: 'Username already exists' });
}
// Hash password
const passwordHash = await bcrypt.hash(password, 10);
// Create user
const result = db.run(
'INSERT INTO users (username, password_hash, email, storage_limit) VALUES (?, ?, ?, ?)',
[username, passwordHash, email, 10 * 1024 * 1024 * 1024] // 10GB
);
const token = jwt.sign({ userId: result.lastInsertRowid }, JWT_SECRET);
res.json({ token, userId: result.lastInsertRowid });
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// Login
router.post('/login', async (req, res) => {
try {
const { username, password } = req.body;
const user = db.query('SELECT * FROM users WHERE username = ?', [username]);
if (user.length === 0) {
return res.status(401).json({ error: 'Invalid credentials' });
}
const validPassword = await bcrypt.compare(password, user[0].password_hash);
if (!validPassword) {
return res.status(401).json({ error: 'Invalid credentials' });
}
const token = jwt.sign({ userId: user[0].id }, JWT_SECRET);
res.json({
token,
user: {
id: user[0].id,
username: user[0].username,
email: user[0].email,
storageUsed: user[0].storage_used,
storageLimit: user[0].storage_limit
}
});
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// Get current user
router.get('/me', (req, res) => {
const token = req.headers.authorization?.replace('Bearer ', '');
if (!token) {
return res.status(401).json({ error: 'No token provided' });
}
try {
const decoded = jwt.verify(token, JWT_SECRET);
const user = db.query('SELECT id, username, email, storage_used, storage_limit FROM users WHERE id = ?', [decoded.userId]);
if (user.length === 0) {
return res.status(404).json({ error: 'User not found' });
}
res.json({ user: user[0] });
} catch (error) {
res.status(401).json({ error: 'Invalid token' });
}
});
module.exports = router;