• 简体中文
  • 认证

    Firmiana 使用不透明的数据库支持的 Bearer Token 进行 Matrix 会话管理,而非纯 JWT。

    令牌类型

    前缀类型生命周期用途
    syt_访问令牌直到撤销认证 API 请求
    fyr_刷新令牌30 天获取新的访问令牌

    认证流程

    注册(UIAA)

    客户端 → POST /register → { flows: [{stages: ["m.login.dummy"]}] }
    客户端 → POST /register → { auth: {type: "m.login.dummy", session: "..."} }
    服务器 → 200 OK → { user_id, access_token, device_id }

    注册使用 UIAA(用户交互认证 API)框架。服务器声明可用的认证流程,客户端完成每个阶段。

    支持的阶段:

    • m.login.password — 用户名/密码认证
    • m.login.dummy — 空操作阶段(用于无密码注册)

    登录

    客户端 → POST /login → { type: "m.login.password", identifier: {type: "m.id.user", user: "alice"}, password: "secret" }
    服务器 → 200 OK → { user_id, access_token, device_id, home_server }

    登录创建新的设备条目并签发访问令牌 + 刷新令牌对。

    令牌刷新

    客户端 → POST /token/refresh → { access_token, refresh_token }
    服务器 → 200 OK → { access_token, refresh_token }

    登出

    客户端 → POST /logout → (撤销当前设备令牌)
    客户端 → POST /logout/all → (撤销所有设备令牌)

    令牌验证

    每个认证请求都经过:

    1. MatrixAccessTokenValidator.validateToken() — 从 Authorization 头提取 Bearer <token>
    2. MatrixTokenService.validateAccessToken() — 在 user_access_tokens 表中查找令牌
    3. 令牌元数据加载到 Authentication 属性中:
      • user_id — Matrix 用户 ID
      • device_id — 设备标识符
      • access_token_id — 数据库记录 ID
      • is_guest — 访客标志
      • is_admin — 管理员标志

    密码存储

    密码使用 PBKDF2 + SHA-256 进行哈希。系统支持在用户成功登录时自动升级旧版哈希格式。

    配置

    micronaut:
      security:
        enabled: true
        authentication: bearer
        token:
          name: Authorization
          jwt:
            enabled: true          # 注意:JWT 配置存在但 Matrix 认证使用不透明令牌
            signatures:
              secret:
                default:
                  secret: ${JWT_SECRET:...}
    Warning

    application.yml 中的 jwt.enabled: true 设置是 Matrix 认证的一个干扰项。Matrix 会话令牌是不透明的数据库支持令牌,不是 JWT。JWT 配置用于 Micronaut Security 集成,但不是会话验证的来源。