Files
SecMPS/gateway/src/IntegrationGateway.Adapters.Owl/OwlAuthHelper.cs
2026-05-16 23:32:50 +08:00

62 lines
2.2 KiB
C#

using System.Security.Cryptography;
using System.Text;
using System.Text.Json;
namespace IntegrationGateway.Adapters.Owl;
public class OwlAuthHelper
{
private readonly HttpClient _http;
private readonly string _baseUrl;
private readonly string _username;
private readonly string _password;
private string? _token;
private DateTime _tokenExpiry = DateTime.MinValue;
public OwlAuthHelper(HttpClient http, string baseUrl, string username, string password)
{
_http = http;
_baseUrl = baseUrl.TrimEnd('/');
_username = username;
_password = password;
}
public async Task<string> GetTokenAsync()
{
if (!string.IsNullOrEmpty(_token) && DateTime.UtcNow < _tokenExpiry)
return _token;
var keyResp = await _http.GetStringAsync($"{_baseUrl}/login/key");
var keyData = JsonSerializer.Deserialize<LoginKeyResponse>(keyResp);
var publicKey = Encoding.UTF8.GetString(Convert.FromBase64String(keyData!.Key!));
using var rsa = RSA.Create();
rsa.ImportFromPem(publicKey);
var plain = JsonSerializer.Serialize(new { username = _username, password = _password });
var encrypted = rsa.Encrypt(Encoding.UTF8.GetBytes(plain), RSAEncryptionPadding.Pkcs1);
var payload = JsonSerializer.Serialize(new { data = Convert.ToBase64String(encrypted) });
var resp = await _http.PostAsync($"{_baseUrl}/login",
new StringContent(payload, Encoding.UTF8, "application/json"));
resp.EnsureSuccessStatusCode();
var loginResult = await resp.Content.ReadFromJsonAsync<LoginResponse>();
_token = loginResult!.Token;
_tokenExpiry = DateTime.UtcNow.AddDays(2.5);
return _token;
}
public void Invalidate() => _token = null;
public async Task<HttpClient> GetAuthenticatedClientAsync()
{
var token = await GetTokenAsync();
var client = new HttpClient { BaseAddress = new Uri(_baseUrl) };
client.DefaultRequestHeaders.Add("Authorization", $"Bearer {token}");
return client;
}
public class LoginKeyResponse { public string? Key { get; set; } }
public class LoginResponse { public string Token { get; set; } = ""; public string? User { get; set; } }
}