mirror of
https://github.com/opengram-server/opengram.git
synced 2026-08-09 07:43:23 +03:00
72 lines
2.9 KiB
C#
72 lines
2.9 KiB
C#
using System.Security.Claims;
|
||
|
||
namespace MyTelegram.Admin.Api.Middleware;
|
||
|
||
/// <summary>
|
||
/// Middleware аутентификации для Admin API.
|
||
/// Для всех админских эндпоинтов требует API-ключ или токен.
|
||
/// </summary>
|
||
public class AdminAuthMiddleware
|
||
{
|
||
private readonly RequestDelegate _next;
|
||
private readonly ILogger<AdminAuthMiddleware> _logger;
|
||
private readonly string _adminApiKey;
|
||
|
||
public AdminAuthMiddleware(RequestDelegate next, ILogger<AdminAuthMiddleware> logger, IConfiguration configuration)
|
||
{
|
||
_next = next;
|
||
_logger = logger;
|
||
|
||
// Берём ключ из конфигурации или переменной окружения,
|
||
// значение по умолчанию пригодно только для разработки
|
||
_adminApiKey = configuration["ADMIN_API_KEY"]
|
||
?? Environment.GetEnvironmentVariable("ADMIN_API_KEY")
|
||
?? "CHANGE_ME_IN_PRODUCTION";
|
||
|
||
if (_adminApiKey == "CHANGE_ME_IN_PRODUCTION")
|
||
{
|
||
_logger.LogWarning("Using default Admin API key! Set ADMIN_API_KEY environment variable.");
|
||
}
|
||
else
|
||
{
|
||
_logger.LogInformation("Admin API authentication enabled with custom key");
|
||
}
|
||
}
|
||
|
||
public async Task InvokeAsync(HttpContext context)
|
||
{
|
||
var path = context.Request.Path.Value;
|
||
|
||
// Проверяем аутентификацию для всех эндпоинтов /api/*
|
||
if (path != null && path.StartsWith("/api/"))
|
||
{
|
||
// Сначала ищем ключ в заголовке X-Admin-API-Key
|
||
if (!context.Request.Headers.TryGetValue("X-Admin-API-Key", out var apiKey) ||
|
||
apiKey != _adminApiKey)
|
||
{
|
||
// Затем пробуем заголовок Authorization с Bearer-токеном
|
||
if (!context.Request.Headers.TryGetValue("Authorization", out var authHeader) ||
|
||
!authHeader.ToString().StartsWith("Bearer ") ||
|
||
authHeader.ToString().Substring(7) != _adminApiKey)
|
||
{
|
||
_logger.LogWarning("Unauthorized Admin API access attempt - IP: {IP}, Path: {Path}",
|
||
context.Connection.RemoteIpAddress, path);
|
||
|
||
context.Response.StatusCode = 401;
|
||
context.Response.ContentType = "application/json";
|
||
await context.Response.WriteAsJsonAsync(new
|
||
{
|
||
success = false,
|
||
error = "Unauthorized: Invalid or missing API key"
|
||
});
|
||
return;
|
||
}
|
||
}
|
||
|
||
_logger.LogDebug("Admin API access authorized - Path: {Path}", path);
|
||
}
|
||
|
||
await _next(context);
|
||
}
|
||
}
|