2026-02-01 04:27:06 -06:00
|
|
|
namespace FiscalOS.API.Login;
|
|
|
|
|
|
|
|
|
|
internal static class Endpoint
|
|
|
|
|
{
|
|
|
|
|
private const string Route = "/login";
|
|
|
|
|
|
|
|
|
|
public static RouteHandlerBuilder MapLoginEndpoint(this WebApplication app)
|
|
|
|
|
{
|
|
|
|
|
return app.MapPost(Route, HandleAsync);
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-01 08:07:23 -06:00
|
|
|
private static async Task<IResult> HandleAsync(
|
2026-02-02 13:18:15 -06:00
|
|
|
HttpContext httpContext,
|
2026-02-01 08:07:23 -06:00
|
|
|
[FromBody] LoginRequest loginRequest,
|
2026-02-02 04:48:42 -06:00
|
|
|
[FromServices] AppDbContext appDbContext,
|
2026-02-02 06:32:14 -06:00
|
|
|
[FromServices] IPasswordHasher passwordHasher,
|
2026-02-02 13:18:15 -06:00
|
|
|
[FromServices] ITokenGenerator tokenService
|
2026-02-01 08:07:23 -06:00
|
|
|
)
|
2026-02-01 04:27:06 -06:00
|
|
|
{
|
2026-02-01 08:07:23 -06:00
|
|
|
var user = await appDbContext.Users.SingleOrDefaultAsync(u => u.Username == loginRequest.Username);
|
|
|
|
|
|
|
|
|
|
if (user is null)
|
|
|
|
|
{
|
|
|
|
|
return Results.Unauthorized();
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-02 04:48:42 -06:00
|
|
|
var isCorrectPassword = passwordHasher.Verify(loginRequest.Password, user.HashedPassword);
|
|
|
|
|
|
|
|
|
|
if (isCorrectPassword is false)
|
|
|
|
|
{
|
|
|
|
|
return Results.Unauthorized();
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-02 06:32:14 -06:00
|
|
|
var accessToken = tokenService.GenerateAccessToken(user);
|
|
|
|
|
|
|
|
|
|
var refreshToken = tokenService.GenerateRefreshToken(user);
|
|
|
|
|
await appDbContext.RefreshTokens.AddAsync(refreshToken);
|
|
|
|
|
await appDbContext.SaveChangesAsync();
|
|
|
|
|
|
|
|
|
|
httpContext.Response.Cookies.Append(
|
|
|
|
|
"fiscalos_refresh_cookie",
|
|
|
|
|
refreshToken.Token,
|
|
|
|
|
new CookieOptions
|
|
|
|
|
{
|
|
|
|
|
HttpOnly = true,
|
|
|
|
|
Expires = refreshToken.ExpiresAt,
|
2026-02-02 13:18:15 -06:00
|
|
|
SameSite = SameSiteMode.Strict,
|
2026-02-02 06:32:14 -06:00
|
|
|
Secure = true
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
|
2026-02-02 13:18:15 -06:00
|
|
|
return Results.Ok(Response.From(accessToken));
|
2026-02-01 04:27:06 -06:00
|
|
|
}
|
|
|
|
|
}
|