Added Logout endpoints

This commit is contained in:
MarcUs7i 2025-04-27 21:37:34 +02:00
parent 4343cade95
commit 1f03e8caf7
9 changed files with 87 additions and 8 deletions

View file

@ -47,6 +47,24 @@ public class AdminController : ControllerBase
}); });
} }
[HttpDelete("logout")]
public ActionResult<AdminLogoutResponse> Login([FromBody] AdminLogoutRequest request)
{
if (request.AccessToken == string.Empty || !_tokenService.ClearToken(request.AccessToken))
{
return Ok(new AdminLogoutResponse
{
Success = false,
ErrorMessage = "Invalid access token"
});
}
return Ok(new AdminLogoutResponse
{
Success = true
});
}
private string? GetBearerToken() private string? GetBearerToken()
{ {
if (!HttpContext.Request.Headers.TryGetValue("Authorization", out var authHeader)) if (!HttpContext.Request.Headers.TryGetValue("Authorization", out var authHeader))

View file

@ -24,7 +24,7 @@ public class UserController : ControllerBase
if (user == null) if (user == null)
{ {
return Ok(new UserLoginResponse return Ok(new UserLoginResponse
{ {
Success = false, Success = false,
ErrorMessage = "Invalid PIN" ErrorMessage = "Invalid PIN"
@ -43,6 +43,24 @@ public class UserController : ControllerBase
AccessToken = accessToken AccessToken = accessToken
}); });
} }
[HttpDelete("logout")]
public ActionResult<UserLogoutResponse> Logout([FromBody] UserLogoutRequest request)
{
if (request.AccessToken == string.Empty || !_userManagementService.ClearToken(request.AccessToken))
{
return Ok(new UserLogoutResponse
{
Success = false,
ErrorMessage = "Invalid access token"
});
}
return Ok(new UserLogoutResponse
{
Success = true
});
}
[HttpGet("username")] [HttpGet("username")]
public async Task<ActionResult<UserGetUsernameResponse>> GetUsername() public async Task<ActionResult<UserGetUsernameResponse>> GetUsername()

View file

@ -12,6 +12,17 @@ public class AdminLoginResponse
public string AccessToken { get; set; } = string.Empty; public string AccessToken { get; set; } = string.Empty;
public string? ErrorMessage { get; set; } public string? ErrorMessage { get; set; }
} }
public class AdminLogoutRequest
{
public string AccessToken { get; set; } = string.Empty;
}
public class AdminLogoutResponse
{
public bool Success { get; set; }
public string? ErrorMessage { get; set; }
}
#endregion #endregion
#region User Administration #region User Administration

View file

@ -12,6 +12,17 @@ public class UserLoginResponse
public string AccessToken { get; set; } = string.Empty; public string AccessToken { get; set; } = string.Empty;
public string? ErrorMessage { get; set; } public string? ErrorMessage { get; set; }
} }
public class UserLogoutRequest
{
public string AccessToken { get; set; } = string.Empty;
}
public class UserLogoutResponse
{
public bool Success { get; set; }
public string? ErrorMessage { get; set; }
}
#endregion #endregion
#region User States #region User States

View file

@ -6,6 +6,15 @@
GET {{baseUrl}}/admin/test-exception GET {{baseUrl}}/admin/test-exception
### Admin Logout
# @name logoutAdmin
DELETE {{baseUrl}}/admin/logout
Content-Type: application/json
{
"accessToken": "{{adminToken}}"
}
### Admin Login ### Admin Login
# @name loginAdmin # @name loginAdmin
POST {{baseUrl}}/admin/login POST {{baseUrl}}/admin/login
@ -174,13 +183,22 @@ Authorization: Bearer {{adminToken}}
### User APIs ### ### User APIs ###
### User Login
# @name logoutUser
DELETE {{baseUrl}}/user/logout
Content-Type: application/json
{
"accessToken": "{{userToken}}"
}
### User Login ### User Login
# @name loginUser # @name loginUser
POST {{baseUrl}}/user/login POST {{baseUrl}}/user/login
Content-Type: application/json Content-Type: application/json
{ {
"pin": "2D21" "pin": "{{loginUser}}"
} }
> {% > {%
const userToken = response.body.accessToken; const userToken = response.body.accessToken;

View file

@ -4,6 +4,7 @@ public interface IAdminTokenService
{ {
void StoreToken(string token); void StoreToken(string token);
bool ValidateToken(string token); bool ValidateToken(string token);
bool ClearToken(string token);
} }
public class AdminTokenService : IAdminTokenService public class AdminTokenService : IAdminTokenService
@ -19,4 +20,6 @@ public class AdminTokenService : IAdminTokenService
{ {
return _adminTokens.ContainsKey(token) && _adminTokens[token]; return _adminTokens.ContainsKey(token) && _adminTokens[token];
} }
public bool ClearToken(string token) => _adminTokens.Remove(token);
} }

View file

@ -16,6 +16,7 @@ public interface IUserManagementService
Task<UserModel?> GetUserByNameAsync(string userName); Task<UserModel?> GetUserByNameAsync(string userName);
string GenerateAccessToken(string username); string GenerateAccessToken(string username);
void ResetLoginState(string userName); void ResetLoginState(string userName);
bool ClearToken(string token);
} }
public class UserManagementService : IUserManagementService public class UserManagementService : IUserManagementService
@ -135,4 +136,6 @@ public class UserManagementService : IUserManagementService
u => u.Username == userName, u => u.Username == userName,
Builders<UserModel>.Update.Set(u => u.ResetState, false)); Builders<UserModel>.Update.Set(u => u.ResetState, false));
} }
public bool ClearToken(string accessToken) => _tokenService.ClearToken(accessToken);
} }

View file

@ -5,7 +5,7 @@ public interface IUserTokenService
void StoreToken(string token, string username); void StoreToken(string token, string username);
string? GetUsernameFromToken(string token); string? GetUsernameFromToken(string token);
bool ValidateToken(string token); bool ValidateToken(string token);
void ClearToken(string token); bool ClearToken(string token);
void RemoveTokensForUser(string username); void RemoveTokensForUser(string username);
void UpdateUserInTokens(string oldUsername, string newUsername); void UpdateUserInTokens(string oldUsername, string newUsername);
} }
@ -29,10 +29,7 @@ public class UserTokenService : IUserTokenService
return _userTokens.ContainsKey(token); return _userTokens.ContainsKey(token);
} }
public void ClearToken(string token) public bool ClearToken(string token) => _userTokens.Remove(token);
{
_userTokens.Remove(token);
}
public void RemoveTokensForUser(string username) public void RemoveTokensForUser(string username)
{ {

View file

@ -1,7 +1,7 @@
{ {
"dev": { "dev": {
"loginAdmin": "admin123", "loginAdmin": "admin123",
"loginUser": "value", "loginUser": "2D21",
"createQuestionSet": "value", "createQuestionSet": "value",
"createQuestion": "value" "createQuestion": "value"
} }