Files
tnsu-approval-route/backend/Tnsu.ApprovalRoute.Infrastructure/TnsuPortal/TnsuPortalAuthorizer.cs
T
gorbenko.pavel 82512eb1db
Tests / frontend-test (push) Successful in 44s
Tests / backend-test (push) Failing after 17m4s
Архивация списков (#13)
Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/gorbenko.pavel/tnsu-approval-route/pulls/13
2026-08-19 09:08:36 +00:00

40 lines
2.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.Net.Http.Headers;
namespace Tnsu.ApprovalRoute.Infrastructure.TnsuPortal;
/// <summary>
/// Авторизация запросов к api.tnsu.kz. Вынесена из HttpTnsuPortalClient, потому что
/// к порталу ходит не только справочник сотрудников (см.
/// HttpSharePointWebhookSubscriber), а правило выбора токена должно быть одно.
///
/// Токен берётся в двух режимах, и порядок принципиален:
/// 1) Токен вызывающего пользователя (см. TnsuPortalCallerToken) — из текущего
/// HTTP-запроса либо переданный аргументом в фоновую задачу. Портал тогда
/// видит исходного пользователя, а не сервисное приложение.
/// 2) Его нет вовсе — client_credentials самого сервиса (см.
/// TnsuPortalTokenProvider).
///
/// ВАЖНО про второй путь: TnsuPortal:ClientSecret/Scope в конфигурации пусты
/// (см. appsettings.json), поэтому он сейчас нерабочий — это именно фолбэк, а не
/// штатный режим. Вызывающая сторона обязана это учитывать: см.
/// HttpSharePointWebhookSubscriber, где сбой подписки намеренно не рушит
/// провижининг списка.
/// </summary>
public sealed class TnsuPortalAuthorizer(
TnsuPortalCallerToken callerToken,
TnsuPortalTokenProvider tokenProvider)
{
public async Task AuthorizeAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var caller = callerToken.Current;
if (!string.IsNullOrWhiteSpace(caller))
{
request.Headers.TryAddWithoutValidation("Authorization", caller);
return;
}
var token = await tokenProvider.GetAccessTokenAsync(cancellationToken);
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
}
}