60 lines
1.7 KiB
C#
60 lines
1.7 KiB
C#
using System.Security.Claims;
|
|
using System.Text.Json.Serialization;
|
|
|
|
namespace ChessCubing.Server.Auth;
|
|
|
|
public sealed record LoginRequest(string Username, string Password);
|
|
|
|
public sealed record RegisterRequest(
|
|
string Username,
|
|
string Email,
|
|
string Password,
|
|
string ConfirmPassword,
|
|
string? FirstName,
|
|
string? LastName);
|
|
|
|
public sealed record ApiErrorResponse(string Message);
|
|
|
|
public sealed class AuthSessionResponse
|
|
{
|
|
public bool IsAuthenticated { get; init; }
|
|
|
|
public string? Subject { get; init; }
|
|
|
|
public string? Username { get; init; }
|
|
|
|
public string? Name { get; init; }
|
|
|
|
public string? Email { get; init; }
|
|
|
|
public string[] Roles { get; init; } = [];
|
|
|
|
public static AuthSessionResponse FromUser(ClaimsPrincipal user)
|
|
=> new()
|
|
{
|
|
IsAuthenticated = user.Identity?.IsAuthenticated == true,
|
|
Subject = user.FindFirst("sub")?.Value ?? user.FindFirst(ClaimTypes.NameIdentifier)?.Value,
|
|
Username = user.FindFirst("preferred_username")?.Value ?? user.Identity?.Name,
|
|
Name = user.FindFirst("name")?.Value ?? user.Identity?.Name,
|
|
Email = user.FindFirst("email")?.Value,
|
|
Roles = user.FindAll("role").Select(claim => claim.Value).Distinct(StringComparer.OrdinalIgnoreCase).ToArray(),
|
|
};
|
|
}
|
|
|
|
public sealed class KeycloakUserInfo
|
|
{
|
|
[JsonPropertyName("sub")]
|
|
public string? Subject { get; init; }
|
|
|
|
[JsonPropertyName("preferred_username")]
|
|
public string? PreferredUsername { get; init; }
|
|
|
|
[JsonPropertyName("name")]
|
|
public string? Name { get; init; }
|
|
|
|
[JsonPropertyName("email")]
|
|
public string? Email { get; init; }
|
|
|
|
public string[] Roles { get; set; } = [];
|
|
}
|