Proyecto ChatBot Con Gemini
This commit is contained in:
96
ChatbotApi/Constrollers/AuthController.cs
Normal file
96
ChatbotApi/Constrollers/AuthController.cs
Normal file
@@ -0,0 +1,96 @@
|
||||
// /Controllers/AuthController.cs
|
||||
using Microsoft.AspNetCore.Identity;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.IdentityModel.Tokens;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.IdentityModel.Tokens.Jwt;
|
||||
using System.Security.Claims;
|
||||
using System.Text;
|
||||
|
||||
public class LoginRequest
|
||||
{
|
||||
[Required]
|
||||
[MaxLength(100)]
|
||||
public required string Username { get; set; }
|
||||
|
||||
[Required]
|
||||
[MaxLength(100)]
|
||||
public required string Password { get; set; }
|
||||
}
|
||||
public class LoginResponse { public required string Token { get; set; } }
|
||||
|
||||
[ApiController]
|
||||
[Route("api/[controller]")]
|
||||
public class AuthController : ControllerBase
|
||||
{
|
||||
private readonly IConfiguration _configuration;
|
||||
private readonly UserManager<IdentityUser> _userManager;
|
||||
|
||||
// Inyectamos el UserManager que gestiona los usuarios
|
||||
public AuthController(IConfiguration configuration, UserManager<IdentityUser> userManager)
|
||||
{
|
||||
_configuration = configuration;
|
||||
_userManager = userManager;
|
||||
}
|
||||
|
||||
[HttpPost("login")]
|
||||
public async Task<IActionResult> Login([FromBody] LoginRequest loginRequest)
|
||||
{
|
||||
// Buscamos al usuario por su nombre
|
||||
var user = await _userManager.FindByNameAsync(loginRequest.Username);
|
||||
|
||||
// Verificamos si el usuario existe y si la contraseña es correcta
|
||||
if (user != null && await _userManager.CheckPasswordAsync(user, loginRequest.Password))
|
||||
{
|
||||
var token = GenerateJwtToken(user);
|
||||
return Ok(new LoginResponse { Token = token });
|
||||
}
|
||||
|
||||
return Unauthorized("Credenciales inválidas.");
|
||||
}
|
||||
|
||||
// Método para crear el primer usuario administrador (solo para configuración inicial)
|
||||
[HttpPost("setup-admin")]
|
||||
public async Task<IActionResult> SetupAdminUser()
|
||||
{
|
||||
var adminUser = await _userManager.FindByNameAsync("admin");
|
||||
if (adminUser == null)
|
||||
{
|
||||
adminUser = new IdentityUser
|
||||
{
|
||||
UserName = "admin",
|
||||
Email = "tecnica@eldia.com",
|
||||
};
|
||||
var result = await _userManager.CreateAsync(adminUser, "Diagonal423");
|
||||
|
||||
if (result.Succeeded)
|
||||
{
|
||||
return Ok("Usuario administrador creado exitosamente.");
|
||||
}
|
||||
return BadRequest(result.Errors);
|
||||
}
|
||||
return Ok("El usuario administrador ya existe.");
|
||||
}
|
||||
|
||||
private string GenerateJwtToken(IdentityUser user)
|
||||
{
|
||||
var jwtKey = _configuration["Jwt:Key"] ?? throw new InvalidOperationException("La clave JWT no está configurada.");
|
||||
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtKey));
|
||||
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
|
||||
|
||||
var claims = new[]
|
||||
{
|
||||
new Claim(JwtRegisteredClaimNames.Sub, user.UserName!),
|
||||
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
|
||||
};
|
||||
|
||||
var token = new JwtSecurityToken(
|
||||
issuer: _configuration["Jwt:Issuer"],
|
||||
audience: _configuration["Jwt:Audience"],
|
||||
claims: claims,
|
||||
expires: DateTime.UtcNow.AddHours(8),
|
||||
signingCredentials: credentials);
|
||||
|
||||
return new JwtSecurityTokenHandler().WriteToken(token);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user