added refresh endpoint and dto

This commit is contained in:
2025-12-03 11:48:03 +01:00
parent e919d89d5b
commit 1aeae34f34
3 changed files with 75 additions and 0 deletions

View File

@@ -0,0 +1,6 @@
namespace ApiEfCoreLibrary.DTO.Refresh.Request;
public class RefreshTokenDto
{
public string? Token { get; set; }
}

View File

@@ -0,0 +1,6 @@
namespace ApiEfCoreLibrary.DTO.Refresh.Response;
public class GetRefreshDto
{
public string? Token { get; set; }
}

View File

@@ -0,0 +1,63 @@
using System.IdentityModel.Tokens.Jwt;
using ApiEfCoreLibrary.DTO.Login.Response;
using ApiEfCoreLibrary.DTO.Refresh.Request;
using ApiEfCoreLibrary.DTO.Refresh.Response;
using FastEndpoints;
using FastEndpoints.Security;
using Microsoft.EntityFrameworkCore;
namespace ApiEfCoreLibrary.Endpoints.Refresh;
public class RefreshTokenEndpoint(LibraryDbContext database) : Endpoint<RefreshTokenDto, GetRefreshDto>
{
public override void Configure()
{
Post("/refresh");
AllowAnonymous();
}
public override async Task HandleAsync(RefreshTokenDto req, CancellationToken ct)
{
try
{
JwtSecurityTokenHandler handler = new JwtSecurityTokenHandler();
var token = handler.ReadJwtToken(req.Token);
string? username = token.Claims.FirstOrDefault(c => c.Type == "Username")?.Value;
if (string.IsNullOrWhiteSpace(username))
{
await Send.UnauthorizedAsync(ct);
return;
}
var login = await database.Logins.FirstOrDefaultAsync(x => x.Username == username, ct);
if (login == null)
{
await Send.UnauthorizedAsync(ct);
return;
}
string jwtToken = JwtBearer.CreateToken(
o =>
{
o.SigningKey = "ThisIsASuperSecretJwtKeyThatIsAtLeast32CharsLong";
o.ExpireAt = DateTime.UtcNow.AddMinutes(15);
if (login.Role != null) o.User.Roles.Add(login.Role);
o.User.Claims.Add(("Username", login.Username)!);
o.User.Claims.Add(("FullName", login.FullName)!);
o.User["UserId"] = "001";
});
GetRefreshDto responseDto = new()
{
Token = jwtToken
};
await Send.OkAsync(responseDto, ct);
}
catch
{
await Send.UnauthorizedAsync(ct);
}
}
}