подписка
Tests / frontend-test (pull_request) Successful in 47s
Tests / backend-test (pull_request) Successful in 2m36s

This commit is contained in:
gorbenko.pavel
2026-08-19 13:30:09 +05:00
parent cf44ae3e2e
commit a1e6c5c8b4
12 changed files with 443 additions and 21 deletions
@@ -0,0 +1,37 @@
using Microsoft.AspNetCore.Http;
namespace Tnsu.ApprovalRoute.Infrastructure.TnsuPortal;
/// <summary>
/// Authorization, с которым идти в api.tnsu.kz в пределах текущей области DI.
///
/// Два источника, и второй нужен именно фоновым задачам:
/// • обрабатывается HTTP-запрос — заголовок берётся прямо из него;
/// • выполняется задача Hangfire — своего HttpContext'а у неё нет, поэтому
/// токен инициировавшего пользователя ей передают аргументом и кладут сюда
/// через <see cref="Set"/> (см. CreateNextListPartitionJob).
///
/// Scoped: Hangfire создаёт отдельную область DI на каждое выполнение задачи,
/// поэтому положенный здесь токен не протекает между задачами.
/// </summary>
public sealed class TnsuPortalCallerToken(IHttpContextAccessor httpContextAccessor)
{
private string? _explicit;
/// <summary>
/// Заголовок целиком, вида «Bearer …». null — вызывающего токена нет
/// (тогда авторизация уходит на client_credentials, см. TnsuPortalAuthorizer).
/// </summary>
public string? Current
{
get
{
var incoming = httpContextAccessor.HttpContext?.Request.Headers.Authorization.ToString();
return string.IsNullOrWhiteSpace(incoming) ? _explicit : incoming;
}
}
/// <summary>Положить токен явно — для кода без HttpContext (фоновые задачи).</summary>
public void Set(string? authorization) =>
_explicit = string.IsNullOrWhiteSpace(authorization) ? null : authorization;
}