using SimApi.Communications; namespace SimApi.Interfaces; /// /// 自定义 Token 解析扩展点,用于让 SimApiAuth.GetLogin 识别本库之外签发的 Token(JWT、第三方登录态等)。 /// /// /// 注册:本库不会自动发现实现,必须由使用者自行注册。AddScoped / AddSingleton / AddTransient /// 均可,因为每次调用都在独立作用域内解析。仅在 EnableSimApiAuth = true 时才会被执行。
/// 调用时机:每次 GetLogin(即每个携带 Token 的请求)都会先执行全部 resolver,再回退到内置缓存查询; /// 因此本机 Login 签发的 Token 同样会走一遍 resolver 链。Logout 与 GetAllLogins 内部也调用 /// GetLogin,同样会触发 resolver 链,其中 GetAllLogins 会按该用户的 Token 数量执行多次。
/// 顺序:按注册顺序依次执行,返回非 null 即作为认证结果并立即短路,后续 resolver 与内置缓存不再参与。
/// 生命周期:每次调用在根容器新建的子作用域内解析,因此可以安全注入 Scoped 服务(如 DbContext)。 /// 但该作用域不是当前请求的作用域,请求级事务 / UnitOfWork 的未提交改动不可见,实现应当只读。
/// 返回值:必须是完全物化的对象。作用域在返回后立即释放,不可返回依赖延迟加载的 EF 追踪实体。
/// Token 管理:返回的登录态不受本库管理,Login / Update / GetAllLogins 不会包含它, /// Logout 对它无效,吊销需由实现方自行处理。
/// 异常:抛出的异常会直接冒泡并中断整条链(该请求认证失败)。表示“不是我的 Token”请返回 null,不要抛异常。
/// 性能:这是认证热路径上的同步方法,查库等 I/O 会阻塞调用线程,建议在实现内部自行做短 TTL 缓存。 ///
public interface ISimApiTokenResolver { /// /// 尝试解析 Token。 /// /// 请求携带的 Token 原文。 /// 解析成功返回登录信息;不属于本实现的 Token 返回 null 由后续 resolver 继续处理。 public SimApiLoginItem? Run(string token); }