Docker Build and Push / build-image (push) Successful in 5m46s
根因一: 过期检测形同虚设 - @zythum02/mijia-api 的 refreshToken() 在本地凭证字段齐全时直接返回成功, 根本不发请求, 因此 checkAuth() 永远判定 ok, 过期后既不出横幅也不出扫码入口 - checkAuth() 改为真打一次 getHomesList() 验证 token; 成功缓存 5 分钟, 失败只缓存 30 秒(便于网络恢复后自愈); 增加并发探测合并; 状态未变不写库 - getStatus() 以实时探测结果为准, DB 里的 status 仅在探测为 unknown 时兜底, 避免残留的 ok 遮蔽已失效状态 根因二: 二维码图片 401 导致弹窗空白 - /api/mihome/reauthorize/qr-image 在 authRequired 之后, 而 <img src> 无法携带 Authorization 头, 图片请求被拒, 用户看到的是空白/裂图 - 新增 fetchMihomeQrImage(): 带 JWT fetch 后转 blob URL 给 <img>, 并在卸载/换码时释放 其他修复 - EnvView 的 load 依赖 [status] 且成功回调又 setStatus, 造成 /status 无限重复请求; 改为空依赖 + 函数式 setStatus; 首屏与重试走 ?force=1 强查 - 会话失效(非网络类错误)时自动弹出扫码窗, 每次挂载仅弹一次 - 扫码状态机新增 done 标记, 只有真正登录成功才算成功, 避免取消后误判 - 二维码 120s 超时自动续码(最多 2 次), 慢扫不再直接失败 - 取消后不再丢弃可能已成功的扫码结果 - scripts/mihome-login.mjs 适配 done 语义 - 同步更新设计文档 §5.2 / §5.4 / §6 注意: 前端需重新构建发布后生效。
38 lines
1.3 KiB
JavaScript
38 lines
1.3 KiB
JavaScript
// 手动扫码授权: npm run data:mihome:login
|
|
// 启动后台 QRlogin, 轮询状态; 出二维码后打印地址, 扫码成功后自动结束.
|
|
import { startQrLogin, getQrState, checkAuth } from '../server/mihome/client.js'
|
|
|
|
const auth = await checkAuth(true)
|
|
if (auth.status === 'ok') {
|
|
console.log('[米家] 已授权有效, 无需重扫 (本地 .cache 凭证可用)')
|
|
process.exit(0)
|
|
}
|
|
|
|
await startQrLogin()
|
|
const started = Date.now()
|
|
console.log('[米家] 等待扫码... (120s 超时)')
|
|
for (;;) {
|
|
const s = getQrState()
|
|
if (s.qrImageUrl && s.state === 'waiting') {
|
|
console.log('[米家] 二维码(需米家 App 扫):')
|
|
console.log(' image: ' + s.qrImageUrl)
|
|
}
|
|
if (s.state === 'failed') {
|
|
console.log('[米家] 扫码失败: ' + (s.lastError || '未知'))
|
|
process.exit(2)
|
|
}
|
|
if (s.done) {
|
|
console.log('[米家] 扫码成功, 凭证已保存到 server/mihome/.cache/')
|
|
process.exit(0)
|
|
}
|
|
if (!s.running && !s.qrImageUrl) {
|
|
// 启动即失败(可能直接完成/或没权限)
|
|
console.log('[米家] 流程结束(无二维码产生), 请检查日志')
|
|
process.exit(2)
|
|
}
|
|
if (Date.now() - started > 150000) {
|
|
console.log('[米家] 超时, 已停止; 可重跑.')
|
|
process.exit(3)
|
|
}
|
|
await new Promise((r) => setTimeout(r, 2000))
|
|
} |