using Microsoft.AspNetCore.Http; namespace Tnsu.ApprovalRoute.Infrastructure.TnsuPortal; /// /// Authorization, с которым идти в api.tnsu.kz в пределах текущей области DI. /// /// Два источника, и второй нужен именно фоновым задачам: /// • обрабатывается HTTP-запрос — заголовок берётся прямо из него; /// • выполняется задача Hangfire — своего HttpContext'а у неё нет, поэтому /// токен инициировавшего пользователя ей передают аргументом и кладут сюда /// через (см. CreateNextListPartitionJob). /// /// Scoped: Hangfire создаёт отдельную область DI на каждое выполнение задачи, /// поэтому положенный здесь токен не протекает между задачами. /// public sealed class TnsuPortalCallerToken(IHttpContextAccessor httpContextAccessor) { private string? _explicit; /// /// Заголовок целиком, вида «Bearer …». null — вызывающего токена нет /// (тогда авторизация уходит на client_credentials, см. TnsuPortalAuthorizer). /// public string? Current { get { var incoming = httpContextAccessor.HttpContext?.Request.Headers.Authorization.ToString(); return string.IsNullOrWhiteSpace(incoming) ? _explicit : incoming; } } /// Положить токен явно — для кода без HttpContext (фоновые задачи). public void Set(string? authorization) => _explicit = string.IsNullOrWhiteSpace(authorization) ? null : authorization; }