feat(dcauth): 移除机器码,改用纯设备码认证

- DCAuth 协议升级到 v2,签名原文只含设备码;客户端 2.0.0,旧版本返回 426
- 删除客户端机器码采集、后端 machine_code_* 字段与日志、后台机器码展示
- 102 迁移在生产执行前直接改为无机器码结构;SQL 守卫仅放行该文件
- Mock 短信不启用每日限额;修复慢电脑首次启动的协议转发竞态
- 新增 macOS DCAuth.app 打包脚本,注册 dcauth:// 协议,浏览器可直接唤起
This commit is contained in:
yml2213
2026-10-21 20:46:25 +08:00
parent cb916d7750
commit ef36453694
28 changed files with 355 additions and 326 deletions
@@ -67,6 +67,9 @@ export async function sendAdminLoginSmsCode(
}
const config = runtimeConfig.worker.sms
const provider = String(config.provider || 'mock')
.trim()
.toLowerCase()
const cooldownMs = Math.max(10, Number(config.cooldownSeconds || 60)) * 1000
const dailyLimit = Math.max(1, Number(config.dailyLimit || 10))
const ttlSeconds = Math.max(60, Number(config.codeTtlSeconds || 300))
@@ -84,6 +87,7 @@ export async function sendAdminLoginSmsCode(
const dayRange = resolveChinaDayRange()
if (
shouldEnforceAdminSmsDailyLimit(provider) &&
(await countAdminSmsCodesOnDay(Number(user.id), dayRange.start, dayRange.end)) >= dailyLimit
) {
throw createHttpError('今日验证码发送次数已达上限,请明天再试', {
@@ -185,6 +189,14 @@ function generateSmsCode(): string {
return code
}
export function shouldEnforceAdminSmsDailyLimit(providerValue: unknown): boolean {
return (
String(providerValue || 'mock')
.trim()
.toLowerCase() !== 'mock'
)
}
function normalizeAdminUsername(value: unknown): string {
return String(value || '')
.trim()