Skip to content

[Feature] Add TOTP (Time-based One-Time Password) Authentication Module #4

@p3ddd

Description

@p3ddd

目标

为 HomeGuard 的核心唤醒操作引入 TOTP 验证机制,防止未经授权的远程触发,提升服务的安全性,特别是在启用远程 Listener 时。

描述

本功能旨在实现一个可配置的 TOTP 验证层,它应能集成到所有 Listener 的处理逻辑中。

1. 配置和初始化

  • 配置:config.yaml 中新增一个可选的 security: 配置块,用于存储 TOTP 的密钥。

    security:
      totp_secret: "BASE32_ENCODED_SECRET_KEY" # 例如:JBSWY3DPEHPK3PXP
      # 留空则表示禁用 TOTP 验证
  • 密钥生成: 在 HomeGuard 启动时,如果 totp_secret 留空,应在日志中输出一个临时的 Base32 密钥和用于扫码的 QR 码 URL,方便用户首次配置。

2. 验证流程 (Verification Flow)

HomeGuard 需要验证用户提交的一次性密码 (OTP)。

  • HTTP API (GET/POST):
    • 请求中必须携带一个额外的参数 otp 或字段 otp,例如:http://.../wakeup?device=desktop&otp=123456
    • 在执行唤醒前,验证 otp 是否与当前或前一个时间窗口生成的 TOTP 匹配。
  • MQTT / Telegram Bot:
    • 在命令负载中(MQTT)或命令文本中(Telegram),要求用户包含 OTP,例如:
      • MQTT Payload: {"device": "desktop", "otp": "123456"}
      • Telegram Command: /wake desktop 123456
  • 验证实现: 利用 Go 语言成熟的 TOTP 库(例如 github.com/pquerna/otp/totp)来实现验证逻辑。

3. 错误处理

  • 如果请求中未提供 OTP 或 OTP 验证失败,应返回明确的错误信息(例如 HTTP 401 Unauthorized 或在 Telegram 中回复验证失败)。
  • 应允许验证当前时间窗口和前一个时间窗口的 OTP,以应对轻微的时钟偏差。

预期价值

  • 高安全性: 即使外部攻击者知道了您的 API 地址或 MQTT 主题,也无法随意触发唤醒。
  • 防止误操作: 作为一个“高消耗”的操作,增加验证门槛可以有效防止意外触发。

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions