F5:token 校验实现本身是对的(用了 timingSafeEqual),问题是缺省值
"oj2-dev-token" 写死在仓库里 —— 写死在仓库里的 token 等于没有 token。
后端改为对齐旧后端 options/options.py:93 的 fail-safe:
env 缺失时生成随机值并在启动日志里告警,判题机连不上,但不会静默用弱默认值。
compose 改为 ${OJ2_JUDGE_TOKEN:?...},未设置直接报错退出。
本地开发怎么设写在 docker/compose.dev.yml 顶部与 .env.example 里:
两个变量名不同(判题机镜像认 TOKEN,后端认 JUDGE_SERVER_TOKEN)但值必须相同。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
37 lines
1.7 KiB
TypeScript
37 lines
1.7 KiB
TypeScript
import { randomBytes } from "node:crypto"
|
||
|
||
/**
|
||
* 判题机 token。对齐旧后端 `options/options.py:93`:
|
||
* token = os.environ.get("JUDGE_SERVER_TOKEN"); return token if token else rand_str()
|
||
* env 缺失时生成随机值 fail-safe —— 宁可判题机连不上(启动时有明显告警),
|
||
* 也不要在仓库里写死一个人人都知道的弱默认值。
|
||
*/
|
||
function judgeServerToken() {
|
||
const fromEnv = process.env.JUDGE_SERVER_TOKEN
|
||
if (fromEnv) return fromEnv
|
||
console.warn(
|
||
"[config] JUDGE_SERVER_TOKEN 未设置,已生成一次性随机 token。" +
|
||
"判题机将无法通过鉴权,本地开发请在 .env 里设置 JUDGE_SERVER_TOKEN," +
|
||
"并让 docker/compose.dev.yml 的 OJ2_JUDGE_TOKEN 取同一个值。",
|
||
)
|
||
return randomBytes(32).toString("hex")
|
||
}
|
||
|
||
export const config = {
|
||
port: Number(process.env.PORT ?? 3000),
|
||
redisUrl: process.env.REDIS_URL ?? "redis://localhost:6380",
|
||
sessionCookie: "oj2_session",
|
||
sessionTtlSeconds: Number(process.env.SESSION_TTL_SECONDS ?? 7 * 24 * 60 * 60),
|
||
secureCookies: process.env.COOKIE_SECURE === "true",
|
||
judgeServerUrl: process.env.JUDGE_SERVER_URL ?? "http://localhost:8081",
|
||
judgeServerToken: judgeServerToken(),
|
||
judgeConcurrency: Number(process.env.JUDGE_CONCURRENCY ?? 2),
|
||
avatarDirectory: process.env.AVATAR_DIRECTORY ?? "data/avatar",
|
||
avatarUriPrefix: process.env.AVATAR_URI_PREFIX ?? "/public/avatar",
|
||
aiBaseUrl: process.env.AI_BASE_URL ?? "https://api.deepseek.com",
|
||
aiKey: process.env.AI_KEY ?? "",
|
||
aiModel: process.env.AI_MODEL ?? "deepseek-v4-flash",
|
||
ruffPath: process.env.RUFF_PATH ?? "ruff",
|
||
clangFormatPath: process.env.CLANG_FORMAT_PATH ?? "clang-format",
|
||
}
|