Files
KF-OnlineJudge/backend/src/kf_oj/modules/identity

identity

负责账号、登录凭证、会话与角色;向其他模块提供经过验证的用户身份和授权依据。 public.py 提供已验证主体,service.py 管理账号和可撤销会话,repository.py 封装持久化。 用户身份不能来自前端自报字段或模型参数。

本地管理命令为 uv run --locked kf-accounts create <username> / disable <username>。 创建口令由隐藏终端提示读取和确认,不接受命令行参数、环境中的默认口令或自助注册。 用户名为 3–24 个小写 ASCII 字母、数字或下划线;口令 12–128 字符,最多 512 UTF-8 字节。 密码摘要由新增的 argon2-cffi 依赖提供 Argon2id,固定 19 MiB/2 次/1 并行度。 参数依据 OWASP 和 argon2-cffi 文档。

登录接口为 /api/v1/auth/login,退出 /logout,当前主体 /me。会话使用随机 256-bit token, 数据库只保存 token / CSRF 摘要;默认 12 小时有效,单账号保留至多 10 个有效会话。 账号禁用立即拒绝登录和旧会话。请求只采用 ASGI 连接 peer,不读取客户端转发地址。 受控启动使用 --no-proxy-headers,避免服务器中间件预先替换 peer;反向代理后的用户共享 该连接预算,引入可信代理的独立限流策略之前不能直接打开客户端转发头信任。 每 peer 至多 10 次登录/15 分钟,预算通过真实数据库串行更新,失败尝试也消耗预算。 摘要计算最多同时 2 次,超出直接 429;限流表至多 4096 桶且每次有界回收过期桶。

有副作用的浏览器请求必须匹配 KF_OJ_BROWSER_ORIGINS 的显式来源;生产只接受 HTTPS 来源, 必须提供生产来源配置。会话 Cookie 为 HttpOnly / SameSite=Strict,生产 Secure;CSRF Cookie 供前端读出请求 token,在 X-CSRF-Token 携带,服务端核对其与当前会话绑定的摘要。 登录、主体和退出响应不缓存;请求校验错误不回显密码或输入值。API 层限制请求字节、块数和 读取期限。跨服务 Worker 凭证不使用用户 Cookie。