using Microsoft.AspNetCore.Mvc; using Microsoft.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; using uWine.Core.Domain.Entities; using uWine.Core.Infrastructure.Services; namespace uWine.Api.Controllers { [ApiController] [Route("/[controller]")] public class UserController : Controller { private readonly IConfiguration _configuration; readonly AuthenticationService _authenticationService; public UserController(IConfiguration configuration, AuthenticationService authenticationService) { _configuration = configuration; _authenticationService = authenticationService; } //public IActionResult Index() //{ // return View(); //} [HttpGet("login")] public IActionResult LoginWithBasic() { if (!Request.Headers.ContainsKey("Authorization")) return Unauthorized("Authorization header missing"); var authHeader = Request.Headers["Authorization"].ToString(); if (!authHeader.StartsWith("Basic ")) return Unauthorized("Invalid auth scheme"); var encodedCredentials = authHeader.Substring("Basic ".Length).Trim(); var decodedBytes = Convert.FromBase64String(encodedCredentials); var decodedCredentials = Encoding.UTF8.GetString(decodedBytes); var parts = decodedCredentials.Split(':', 2); if (parts.Length != 2) return Unauthorized("Invalid credentials format"); var user = new User { Username = parts[0], Password = parts[1] }; var auth = _authenticationService.IsAuthenticated(user); // 🔐 Autenticazione fittizia (da sostituire con verifica DB) if (!auth) return Unauthorized("Credenziali non valide"); user = _authenticationService.User(user); var token = GenerateJwtToken(user); return Ok(new { access_token = token }); } private string GenerateJwtToken(User user) { var jwtSettings = _configuration.GetSection("JwtSettings"); var claims = new[] { new Claim("userId", user.Id.ToString()), new Claim(ClaimTypes.NameIdentifier, Guid.NewGuid().ToString()), new Claim(ClaimTypes.Role, user.Role.Id.ToString()) }; var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings["Secret"])); var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var token = new JwtSecurityToken( issuer: jwtSettings["Issuer"], audience: jwtSettings["Audience"], claims: claims, expires: DateTime.UtcNow.AddMinutes(Convert.ToDouble(jwtSettings["ExpiresInMinutes"])), signingCredentials: creds ); return new JwtSecurityTokenHandler().WriteToken(token); } } }