Files
fiscalos/src/FiscalOS.API/Login/Endpoint.cs
T

54 lines
1.4 KiB
C#
Raw Normal View History

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(
HttpContext httpContext,
2026-02-01 08:07:23 -06:00
[FromBody] LoginRequest loginRequest,
[FromServices] AppDbContext appDbContext,
[FromServices] IPasswordHasher passwordHasher,
[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();
}
var isCorrectPassword = passwordHasher.Verify(loginRequest.Password, user.HashedPassword);
if (isCorrectPassword is false)
{
return Results.Unauthorized();
}
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,
SameSite = SameSiteMode.Strict,
Secure = true
}
);
return Results.Ok(Response.From(accessToken));
2026-02-01 04:27:06 -06:00
}
}