fix: add UNIQUE on email, check dup email in profile update, generic error messages in auth route

This commit is contained in:
2026-07-12 04:20:56 +08:00
parent f2fec8e609
commit 5dd0db76be
2 changed files with 15 additions and 7 deletions

View File

@@ -67,7 +67,7 @@ async function initSchema(connection) {
id INT AUTO_INCREMENT PRIMARY KEY, id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE, username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL, password VARCHAR(255) NOT NULL,
email VARCHAR(100) NOT NULL, email VARCHAR(100) NOT NULL UNIQUE,
game_name VARCHAR(50) NOT NULL, game_name VARCHAR(50) NOT NULL,
game_uid VARCHAR(50) NOT NULL, game_uid VARCHAR(50) NOT NULL,
role ENUM('owner','admin','player') NOT NULL DEFAULT 'player', role ENUM('owner','admin','player') NOT NULL DEFAULT 'player',

View File

@@ -71,7 +71,8 @@ router.post('/register', validateLengths({
res.status(201).json({ message: '注册成功,请查收验证邮件' }); res.status(201).json({ message: '注册成功,请查收验证邮件' });
} catch (err) { } catch (err) {
res.status(500).json({ error: err.message }); console.error('[auth]', err);
res.status(500).json({ error: '服务器内部错误' });
} }
}); });
@@ -91,7 +92,8 @@ router.get('/verify-email', async (req, res) => {
res.json({ message: '邮箱验证成功,现在可以登录了' }); res.json({ message: '邮箱验证成功,现在可以登录了' });
} catch (err) { } catch (err) {
res.status(500).json({ error: err.message }); console.error('[auth]', err);
res.status(500).json({ error: '服务器内部错误' });
} }
}); });
@@ -126,7 +128,8 @@ router.post('/login', async (req, res) => {
}, },
}); });
} catch (err) { } catch (err) {
res.status(500).json({ error: err.message }); console.error('[auth]', err);
res.status(500).json({ error: '服务器内部错误' });
} }
}); });
@@ -139,7 +142,8 @@ router.get('/me', authenticate, async (req, res) => {
if (!user) return res.status(404).json({ error: '用户不存在' }); if (!user) return res.status(404).json({ error: '用户不存在' });
res.json(user); res.json(user);
} catch (err) { } catch (err) {
res.status(500).json({ error: err.message }); console.error('[auth]', err);
res.status(500).json({ error: '服务器内部错误' });
} }
}); });
@@ -157,6 +161,8 @@ router.put('/profile', authenticate, async (req, res) => {
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(req.body.email)) { if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(req.body.email)) {
return res.status(400).json({ error: '邮箱格式不正确' }); return res.status(400).json({ error: '邮箱格式不正确' });
} }
const dup = await getRow('SELECT id FROM users WHERE email = ? AND id != ?', [req.body.email, req.user.id]);
if (dup) return res.status(400).json({ error: '邮箱已被其他账号使用' });
fields.email = req.body.email; fields.email = req.body.email;
} }
@@ -174,7 +180,8 @@ router.put('/profile', authenticate, async (req, res) => {
const token = generateToken(updated); const token = generateToken(updated);
res.json({ message: '更新成功', token, user: updated }); res.json({ message: '更新成功', token, user: updated });
} catch (err) { } catch (err) {
res.status(500).json({ error: err.message }); console.error('[auth]', err);
res.status(500).json({ error: '服务器内部错误' });
} }
}); });
@@ -196,7 +203,8 @@ router.put('/password', authenticate, async (req, res) => {
await query('UPDATE users SET password = ? WHERE id = ?', [hashed, req.user.id]); await query('UPDATE users SET password = ? WHERE id = ?', [hashed, req.user.id]);
res.json({ message: '密码修改成功' }); res.json({ message: '密码修改成功' });
} catch (err) { } catch (err) {
res.status(500).json({ error: err.message }); console.error('[auth]', err);
res.status(500).json({ error: '服务器内部错误' });
} }
}); });