Ajoute une table de gestion des utilisateurs
This commit is contained in:
@@ -32,12 +32,41 @@ public sealed class KeycloakAuthService(HttpClient httpClient, IOptions<Keycloak
|
||||
public async Task<KeycloakUserInfo> RegisterAsync(RegisterRequest request, CancellationToken cancellationToken)
|
||||
{
|
||||
var adminToken = await RequestAdminTokenAsync(cancellationToken);
|
||||
var userId = await CreateUserAsync(adminToken, request, cancellationToken);
|
||||
var userId = await CreateUserAsync(
|
||||
adminToken,
|
||||
request.Username,
|
||||
request.Email,
|
||||
request.FirstName,
|
||||
request.LastName,
|
||||
isEnabled: true,
|
||||
isEmailVerified: false,
|
||||
cancellationToken);
|
||||
await SetPasswordAsync(adminToken, userId, request.Password, cancellationToken);
|
||||
await TryAssignPlayerRoleAsync(adminToken, userId, cancellationToken);
|
||||
return await LoginAsync(request.Username, request.Password, cancellationToken);
|
||||
}
|
||||
|
||||
public async Task<AdminIdentityUser> CreateAdminUserAsync(
|
||||
AdminIdentityUserCreateRequest request,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
var adminToken = await RequestAdminTokenAsync(cancellationToken);
|
||||
var userId = await CreateUserAsync(
|
||||
adminToken,
|
||||
request.Username,
|
||||
request.Email,
|
||||
request.FirstName,
|
||||
request.LastName,
|
||||
request.IsEnabled,
|
||||
request.IsEmailVerified,
|
||||
cancellationToken);
|
||||
|
||||
await SetPasswordAsync(adminToken, userId, request.Password, cancellationToken);
|
||||
await TryAssignPlayerRoleAsync(adminToken, userId, cancellationToken);
|
||||
|
||||
return await GetAdminUserAsync(adminToken, userId, cancellationToken);
|
||||
}
|
||||
|
||||
public async Task<IReadOnlyList<AdminIdentityUser>> GetAdminUsersAsync(CancellationToken cancellationToken)
|
||||
{
|
||||
var adminToken = await RequestAdminTokenAsync(cancellationToken);
|
||||
@@ -119,6 +148,25 @@ public sealed class KeycloakAuthService(HttpClient httpClient, IOptions<Keycloak
|
||||
return await GetAdminUserAsync(adminToken, userId, cancellationToken);
|
||||
}
|
||||
|
||||
public async Task DeleteAdminUserAsync(string userId, CancellationToken cancellationToken)
|
||||
{
|
||||
var adminToken = await RequestAdminTokenAsync(cancellationToken);
|
||||
|
||||
using var request = new HttpRequestMessage(HttpMethod.Delete, $"{GetAdminBaseUrl()}/users/{Uri.EscapeDataString(userId)}");
|
||||
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", adminToken);
|
||||
|
||||
using var response = await _httpClient.SendAsync(request, cancellationToken);
|
||||
if (response.StatusCode == HttpStatusCode.NotFound)
|
||||
{
|
||||
throw new KeycloakAuthException("Utilisateur introuvable dans Keycloak.", StatusCodes.Status404NotFound);
|
||||
}
|
||||
|
||||
if (!response.IsSuccessStatusCode)
|
||||
{
|
||||
throw new KeycloakAuthException("La suppression du compte Keycloak a echoue.", (int)response.StatusCode);
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<TokenSuccessResponse> RequestPasswordTokenAsync(string username, string password, CancellationToken cancellationToken)
|
||||
{
|
||||
var formData = new Dictionary<string, string>
|
||||
@@ -208,18 +256,26 @@ public sealed class KeycloakAuthService(HttpClient httpClient, IOptions<Keycloak
|
||||
return userInfo;
|
||||
}
|
||||
|
||||
private async Task<string> CreateUserAsync(string adminToken, RegisterRequest request, CancellationToken cancellationToken)
|
||||
private async Task<string> CreateUserAsync(
|
||||
string adminToken,
|
||||
string username,
|
||||
string? email,
|
||||
string? firstName,
|
||||
string? lastName,
|
||||
bool isEnabled,
|
||||
bool isEmailVerified,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
using var httpRequest = new HttpRequestMessage(HttpMethod.Post, $"{GetAdminBaseUrl()}/users")
|
||||
{
|
||||
Content = JsonContent.Create(new
|
||||
{
|
||||
username = request.Username.Trim(),
|
||||
email = request.Email.Trim(),
|
||||
enabled = true,
|
||||
emailVerified = false,
|
||||
firstName = string.IsNullOrWhiteSpace(request.FirstName) ? null : request.FirstName.Trim(),
|
||||
lastName = string.IsNullOrWhiteSpace(request.LastName) ? null : request.LastName.Trim(),
|
||||
username = username.Trim(),
|
||||
email = string.IsNullOrWhiteSpace(email) ? null : email.Trim(),
|
||||
enabled = isEnabled,
|
||||
emailVerified = isEmailVerified,
|
||||
firstName = string.IsNullOrWhiteSpace(firstName) ? null : firstName.Trim(),
|
||||
lastName = string.IsNullOrWhiteSpace(lastName) ? null : lastName.Trim(),
|
||||
}, options: JsonOptions)
|
||||
};
|
||||
httpRequest.Headers.Authorization = new AuthenticationHeaderValue("Bearer", adminToken);
|
||||
@@ -241,7 +297,7 @@ public sealed class KeycloakAuthService(HttpClient httpClient, IOptions<Keycloak
|
||||
return userId.Trim('/');
|
||||
}
|
||||
|
||||
var fallbackUserId = await FindUserIdByUsernameAsync(adminToken, request.Username, cancellationToken);
|
||||
var fallbackUserId = await FindUserIdByUsernameAsync(adminToken, username, cancellationToken);
|
||||
if (!string.IsNullOrWhiteSpace(fallbackUserId))
|
||||
{
|
||||
return fallbackUserId;
|
||||
|
||||
Reference in New Issue
Block a user