diff --git a/api/Program.cs b/api/Program.cs index 8f51fb4..6bf5190 100644 --- a/api/Program.cs +++ b/api/Program.cs @@ -39,7 +39,8 @@ builder.Services.AddAuthentication(options => { ValidateIssuerSigningKey = true, ValidIssuer = "agologum", ValidAudience = "agologum", - IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key)) + IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key)), + ClockSkew = TimeSpan.Zero }; }); diff --git a/api/src/Controllers/AuthController.cs b/api/src/Controllers/AuthController.cs index d3e09ee..8afd69e 100644 --- a/api/src/Controllers/AuthController.cs +++ b/api/src/Controllers/AuthController.cs @@ -67,10 +67,10 @@ public class AuthController : ControllerBase { [Authorize] // authorize is handled by middleware [HttpPost("logout")] - public ActionResult Logout() { - // dummy endpoint - // logout happens upon client-side jwt removal - // TODO: expire all refresh tokens + public async Task Logout(string refreshTokenString) { + // revoke refresh token + bool success = await jwt_.RevokeRefreshToken(refreshTokenString); + if(!success) return NotFound(); return Ok(); } @@ -106,7 +106,6 @@ public class AuthController : ControllerBase { } // TODO - // refresh tokens // email verification // password reset // oh hell naw 2FA I do not care enough diff --git a/api/src/Services/JwtService.cs b/api/src/Services/JwtService.cs index 775e9c8..54f1c15 100644 --- a/api/src/Services/JwtService.cs +++ b/api/src/Services/JwtService.cs @@ -69,4 +69,12 @@ public class JwtService { return await db_.Users.FindAsync(id); } + public async Task RevokeRefreshToken(string refreshTokenString) { + var refreshToken = await db_.RefreshTokens.FirstOrDefaultAsync(u => u.Token == refreshTokenString); + if(refreshToken == null) return false; + refreshToken.IsRevoked = true; + await db_.SaveChangesAsync(); + return true; + } + } \ No newline at end of file