88 lines
3.1 KiB
C#
88 lines
3.1 KiB
C#
using System.Text;
|
|
using Microsoft.Extensions.Options;
|
|
using Newtonsoft.Json;
|
|
|
|
namespace FictionArchive.Service.UserService.Services.AuthenticationClient.Authentik;
|
|
|
|
public class AuthentikClient : IAuthenticationServiceClient
|
|
{
|
|
private readonly HttpClient _httpClient;
|
|
private readonly ILogger<AuthentikClient> _logger;
|
|
private readonly AuthentikConfiguration _configuration;
|
|
|
|
public AuthentikClient(
|
|
HttpClient httpClient,
|
|
ILogger<AuthentikClient> logger,
|
|
IOptions<AuthentikConfiguration> configuration)
|
|
{
|
|
_httpClient = httpClient;
|
|
_logger = logger;
|
|
_configuration = configuration.Value;
|
|
}
|
|
|
|
public async Task<AuthentikUserResponse?> CreateUserAsync(string username, string email, string displayName)
|
|
{
|
|
var request = new AuthentikAddUserRequest
|
|
{
|
|
Username = username,
|
|
Email = email,
|
|
DisplayName = displayName,
|
|
IsActive = true
|
|
};
|
|
|
|
try
|
|
{
|
|
var json = JsonConvert.SerializeObject(request);
|
|
var content = new StringContent(json, Encoding.UTF8, "application/json");
|
|
var response = await _httpClient.PostAsync("/api/v3/core/users/", content);
|
|
|
|
if (!response.IsSuccessStatusCode)
|
|
{
|
|
var errorContent = await response.Content.ReadAsStringAsync();
|
|
_logger.LogError(
|
|
"Failed to create user in Authentik. Status: {StatusCode}, Error: {Error}",
|
|
response.StatusCode, errorContent);
|
|
return null;
|
|
}
|
|
|
|
var responseJson = await response.Content.ReadAsStringAsync();
|
|
var userResponse = JsonConvert.DeserializeObject<AuthentikUserResponse>(responseJson);
|
|
_logger.LogInformation("Successfully created user {Username} in Authentik with pk {Pk}",
|
|
username, userResponse?.Pk);
|
|
|
|
return userResponse;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_logger.LogError(ex, "Exception while creating user {Username} in Authentik", username);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public async Task<bool> SendRecoveryEmailAsync(int authentikUserId)
|
|
{
|
|
try
|
|
{
|
|
var response = await _httpClient.PostAsync(
|
|
$"/api/v3/core/users/{authentikUserId}/recovery_email/?email_stage={_configuration.EmailStageId}",
|
|
null);
|
|
|
|
if (!response.IsSuccessStatusCode)
|
|
{
|
|
var errorContent = await response.Content.ReadAsStringAsync();
|
|
_logger.LogError(
|
|
"Failed to send recovery email for user {UserId}. Status: {StatusCode}, Error: {Error}",
|
|
authentikUserId, response.StatusCode, errorContent);
|
|
return false;
|
|
}
|
|
|
|
_logger.LogInformation("Successfully sent recovery email to Authentik user {UserId}", authentikUserId);
|
|
return true;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_logger.LogError(ex, "Exception while sending recovery email to Authentik user {UserId}", authentikUserId);
|
|
return false;
|
|
}
|
|
}
|
|
} |