zhizhi/persona-studio/backend/routes/auth.js

115 lines
2.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 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;