Skip to content

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

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 主题,也无法随意触发唤醒。
  • 防止误操作: 作为一个“高消耗”的操作,增加验证门槛可以有效防止意外触发。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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