using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.IdentityModel.Tokens; namespace CodePlay.Web.Controllers; [ApiController] [Route("api/[controller]")] public class AuthController : ControllerBase { private readonly IConfiguration _configuration; private readonly ILogger _logger; public AuthController(IConfiguration configuration, ILogger logger) { _configuration = configuration; _logger = logger; } [HttpPost("login")] [AllowAnonymous] public async Task> Login([FromBody] LoginRequest request) { if (string.IsNullOrEmpty(request.Username) || string.IsNullOrEmpty(request.Password)) { return BadRequest(new { message = "Username and password are required" }); } if (request.Username.Length < 3 || request.Password.Length < 6) { return Unauthorized(new { message = "Invalid credentials" }); } var token = GenerateJwtToken(request.Username); return Ok(new LoginResponse { Token = token, Username = request.Username, ExpiresIn = 3600 }); } [HttpPost("refresh")] [Authorize] public async Task> RefreshToken() { var username = User.FindFirst(ClaimTypes.Name)?.Value; if (string.IsNullOrEmpty(username)) { return Unauthorized(); } var token = GenerateJwtToken(username); return Ok(new LoginResponse { Token = token, Username = username, ExpiresIn = 3600 }); } [HttpGet("me")] [Authorize] public ActionResult GetCurrentUser() { var username = User.FindFirst(ClaimTypes.Name)?.Value; return Ok(new UserInfo { Username = username ?? "Unknown", Roles = User.FindAll(ClaimTypes.Role).Select(c => c.Value).ToList() }); } private string GenerateJwtToken(string username) { var key = Encoding.UTF8.GetBytes("YourSuperSecretKeyThatIsAtLeast32CharactersLong"); var claims = new[] { new Claim(ClaimTypes.Name, username), new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()) }; var tokenDescriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(claims), Expires = DateTime.UtcNow.AddHours(1), SigningCredentials = new SigningCredentials( new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature) }; var tokenHandler = new JwtSecurityTokenHandler(); var token = tokenHandler.CreateToken(tokenDescriptor); return tokenHandler.WriteToken(token); } } public class LoginRequest { public string Username { get; set; } = string.Empty; public string Password { get; set; } = string.Empty; } public class LoginResponse { public string Token { get; set; } = string.Empty; public string Username { get; set; } = string.Empty; public int ExpiresIn { get; set; } } public class UserInfo { public string Username { get; set; } = string.Empty; public string? Email { get; set; } public List Roles { get; set; } = new(); }