115 lines
2.8 KiB
JavaScript
115 lines
2.8 KiB
JavaScript
/**
|
||
* persona-studio · 登录校验路由
|
||
* POST /api/ps/auth/login { dev_id: "EXP-000" }
|
||
*/
|
||
const express = require('express');
|
||
const router = express.Router();
|
||
const path = require('path');
|
||
const fs = require('fs');
|
||
const crypto = require('crypto');
|
||
|
||
const HUMAN_REGISTRY_PATH = path.join(__dirname, '..', '..', 'brain', 'human-registry.json');
|
||
const REGISTRY_PATH = path.join(__dirname, '..', '..', 'brain', 'registry.json');
|
||
|
||
function loadHumanRegistry() {
|
||
try {
|
||
return JSON.parse(fs.readFileSync(HUMAN_REGISTRY_PATH, 'utf-8'));
|
||
} catch {
|
||
return { developers: [] };
|
||
}
|
||
}
|
||
|
||
function loadRegistry() {
|
||
try {
|
||
return JSON.parse(fs.readFileSync(REGISTRY_PATH, 'utf-8'));
|
||
} catch {
|
||
return { developers: {}, guest_mode: {} };
|
||
}
|
||
}
|
||
|
||
function findDeveloper(devId) {
|
||
const humanReg = loadHumanRegistry();
|
||
if (humanReg.developers && Array.isArray(humanReg.developers)) {
|
||
const found = humanReg.developers.find(d => d.exp_id === devId);
|
||
if (found) {
|
||
return { name: found.name, status: found.status, role: found.role };
|
||
}
|
||
}
|
||
|
||
const registry = loadRegistry();
|
||
const entry = registry.developers && registry.developers[devId];
|
||
if (entry) {
|
||
return { name: entry.name, status: entry.status, role: entry.role };
|
||
}
|
||
|
||
return null;
|
||
}
|
||
|
||
// POST /api/ps/auth/login
|
||
router.post('/login', (req, res) => {
|
||
const { dev_id } = req.body || {};
|
||
|
||
// 访客体验模式
|
||
if (dev_id === 'GUEST') {
|
||
const registry = loadRegistry();
|
||
const guestConfig = registry.guest_mode || {};
|
||
|
||
if (!guestConfig.enabled) {
|
||
return res.status(403).json({
|
||
error: true,
|
||
code: 'GUEST_DISABLED',
|
||
message: '访客体验暂未开放,正式编号用户(EXP-XXX)可正常登录'
|
||
});
|
||
}
|
||
|
||
const token = crypto.randomBytes(32).toString('hex');
|
||
return res.json({
|
||
error: false,
|
||
dev_id: 'GUEST',
|
||
name: guestConfig.name || '访客体验者',
|
||
status: 'guest',
|
||
token
|
||
});
|
||
}
|
||
|
||
if (!dev_id || !/^EXP-\d{3,}$/.test(dev_id)) {
|
||
return res.status(400).json({
|
||
error: true,
|
||
code: 'INVALID_ID',
|
||
message: '编号格式不正确,请使用 EXP-XXX 格式'
|
||
});
|
||
}
|
||
|
||
const entry = findDeveloper(dev_id);
|
||
|
||
if (!entry) {
|
||
return res.status(404).json({
|
||
error: true,
|
||
code: 'NOT_FOUND',
|
||
message: '编号未注册,请联系管理员获取编号'
|
||
});
|
||
}
|
||
|
||
if (entry.status !== 'active' && entry.status !== 'pending_activation') {
|
||
return res.status(403).json({
|
||
error: true,
|
||
code: 'INACTIVE',
|
||
message: '编号未激活,请联系管理员'
|
||
});
|
||
}
|
||
|
||
// 生成简单 session token
|
||
const token = crypto.randomBytes(32).toString('hex');
|
||
|
||
res.json({
|
||
error: false,
|
||
dev_id,
|
||
name: entry.name,
|
||
status: entry.status,
|
||
role: entry.role,
|
||
token
|
||
});
|
||
});
|
||
|
||
module.exports = router;
|