62 lines
2.2 KiB
C#
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; } }
|
|
}
|