added refresh endpoint and dto
This commit is contained in:
6
ApiEfCoreLibrary/DTO/Refresh/Request/RefreshTokenDto.cs
Normal file
6
ApiEfCoreLibrary/DTO/Refresh/Request/RefreshTokenDto.cs
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
namespace ApiEfCoreLibrary.DTO.Refresh.Request;
|
||||||
|
|
||||||
|
public class RefreshTokenDto
|
||||||
|
{
|
||||||
|
public string? Token { get; set; }
|
||||||
|
}
|
||||||
6
ApiEfCoreLibrary/DTO/Refresh/Response/GetRefreshDto.cs
Normal file
6
ApiEfCoreLibrary/DTO/Refresh/Response/GetRefreshDto.cs
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
namespace ApiEfCoreLibrary.DTO.Refresh.Response;
|
||||||
|
|
||||||
|
public class GetRefreshDto
|
||||||
|
{
|
||||||
|
public string? Token { get; set; }
|
||||||
|
}
|
||||||
63
ApiEfCoreLibrary/Endpoints/Refresh/RefreshTokenEndpoint.cs
Normal file
63
ApiEfCoreLibrary/Endpoints/Refresh/RefreshTokenEndpoint.cs
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user