using Dpz.Core.Public.ViewModel.Response;

namespace Dpz.Core.Service.RepositoryService;

public interface IUserTwoFactorService
{
    /// <summary>
    /// 获取用户安全绑定状态,包括 2FA 与 Passkey 是否已绑定
    /// </summary>
    /// <param name="account">用户账号</param>
    /// <param name="cancellationToken">取消令牌</param>
    /// <returns>用户安全绑定状态;账号无效或用户不存在时返回未绑定状态</returns>
    Task<UserSecurityBindingStatusResponse> GetBindingStatusAsync(
        string? account,
        CancellationToken cancellationToken = default
    );

    /// <summary>
    /// 开始 2FA 绑定流程,生成临时密钥和 setup token,并写入短期缓存
    /// </summary>
    /// <param name="account">用户账号</param>
    /// <param name="cancellationToken">取消令牌</param>
    /// <returns>临时凭据;账号无效、用户不存在或已绑定 2FA 时返回 null</returns>
    Task<UserTwoFactorSetupChallenge?> BeginSetupAsync(
        string? account,
        CancellationToken cancellationToken = default
    );

    /// <summary>
    /// 获取已绑定 2FA 用户的密钥
    /// </summary>
    /// <param name="account">用户账号</param>
    /// <param name="cancellationToken">取消令牌</param>
    /// <returns>已绑定密钥;账号无效、用户不存在、未绑定或密钥为空时返回 null</returns>
    Task<string?> GetBoundKeyAsync(string? account, CancellationToken cancellationToken = default);

    /// <summary>
    /// 根据 setup token 读取 2FA 绑定流程中的临时密钥
    /// </summary>
    /// <param name="account">用户账号</param>
    /// <param name="setupToken">绑定流程开始时生成的 setup token</param>
    /// <param name="cancellationToken">取消令牌</param>
    /// <returns>临时密钥;token 无效、过期或账号不匹配时返回 null</returns>
    Task<string?> GetSetupKeyAsync(
        string? account,
        string? setupToken,
        CancellationToken cancellationToken = default
    );

    /// <summary>
    /// 使用 setup token 完成 2FA 绑定,并将临时密钥写入数据库
    /// </summary>
    /// <param name="account">用户账号</param>
    /// <param name="setupToken">绑定流程开始时生成的 setup token</param>
    /// <param name="cancellationToken">取消令牌</param>
    /// <returns>异步任务</returns>
    Task BindAsync(
        string? account,
        string? setupToken,
        CancellationToken cancellationToken = default
    );

    /// <summary>
    /// 解绑 2FA,并清除已保存的密钥
    /// </summary>
    /// <param name="account">用户账号</param>
    /// <param name="cancellationToken">取消令牌</param>
    /// <returns>异步任务</returns>
    Task UnbindAsync(string? account, CancellationToken cancellationToken = default);
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

代码说明

这是一个 用户双因素认证(2FA)服务接口的定义文件,属于仓储服务层。

接口概述

IUserTwoFactorService 定义了管理用户双因素认证(Two-Factor Authentication, 2FA)的核心功能,包括绑定、解绑、状态查询等操作。

方法详解

1. GetBindingStatusAsync

功能:查询用户的安全绑定状态

  • 参数:
    • account:用户账号
    • cancellationToken:用于取消异步操作的令牌
  • 返回:UserSecurityBindingStatusResponse - 包含 2FA 和 Passkey 的绑定状态
  • 特殊处理:账号无效或用户不存在时返回未绑定状态

2. BeginSetupAsync

功能:启动 2FA 绑定流程

  • 流程:
    1. 生成临时密钥(secret key)
    2. 生成 setup token(用于后续验证)
    3. 将数据写入短期缓存
  • 返回:UserTwoFactorSetupChallenge - 包含临时凭据信息
  • 失败场景:账号无效、用户不存在或已绑定 2FA 时返回 null

3. GetBoundKeyAsync

功能:获取已绑定用户的 2FA 密钥

  • 用途:用于验证用户输入的动态验证码
  • 返回:已绑定的密钥字符串
  • 失败场景:账号无效、用户不存在、未绑定或密钥为空时返回 null

4. GetSetupKeyAsync

功能:在绑定流程中获取临时密钥

  • 参数:
    • setupToken:绑定流程开始时生成的令牌
  • 用途:用于在绑定完成前验证用户输入的验证码
  • 返回:临时密钥
  • 失败场景:token 无效、过期或账号不匹配时返回 null

5. BindAsync

功能:完成 2FA 绑定

  • 流程:
    1. 验证 setup token 有效性
    2. 从缓存中读取临时密钥
    3. 将密钥持久化到数据库
    4. 清除缓存中的临时数据
  • 无返回值:操作成功/失败通过异常处理

6. UnbindAsync

功能:解除 2FA 绑定

  • 操作:清除数据库中保存的密钥
  • 无返回值

设计特点

  1. 异步模式:所有方法都是异步的,支持高并发场景
  2. 可空参数:account 和 setupToken 使用可空类型,提高容错性
  3. 取消令牌:支持操作取消,提升用户体验
  4. 分阶段绑定:使用临时密钥 + setup token 的两阶段验证机制,提高安全性
  5. 防御性设计:在多种异常情况下返回 null 而非抛出异常

典型使用场景

用户绑定 2FA 流程:
1. 调用 GetBindingStatusAsync 检查是否已绑定
2. 调用 BeginSetupAsync 获取临时密钥和二维码
3. 用户扫描二维码后输入验证码
4. 调用 GetSetupKeyAsync 验证用户输入
5. 调用 BindAsync 完成绑定
评论加载中...