// backend/Program.cs using Inventario.API.Data; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.IdentityModel.Tokens; using System.Text; using Microsoft.OpenApi.Models; var builder = WebApplication.CreateBuilder(args); builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = builder.Configuration["Jwt:Issuer"], ValidAudience = builder.Configuration["Jwt:Audience"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]!)) }; }); // Add services to the container. builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); // CONFIGURACIÓN DE SWAGGER builder.Services.AddSwaggerGen(options => { // 1. Definir el esquema de seguridad (JWT Bearer) options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme { Description = "Autenticación JWT usando el esquema Bearer. " + "Introduce 'Bearer' [espacio] y luego tu token en el campo de abajo. " + "Ejemplo: 'Bearer 12345abcdef'", Name = "Authorization", // El nombre del header In = ParameterLocation.Header, // Dónde se envía (en la cabecera) Type = SecuritySchemeType.ApiKey, // Tipo de esquema Scheme = "Bearer" }); // 2. Aplicar el requisito de seguridad globalmente a todos los endpoints options.AddSecurityRequirement(new OpenApiSecurityRequirement() { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" // Debe coincidir con el Id de AddSecurityDefinition }, Scheme = "oauth2", Name = "Bearer", In = ParameterLocation.Header, }, new List() } }); }); // --- DEFINIR LA POLÍTICA CORS --- // Definimos un nombre para nuestra política var MyAllowSpecificOrigins = "_myAllowSpecificOrigins"; // Añadimos el servicio de CORS y configuramos la política builder.Services.AddCors(options => { options.AddPolicy(name: MyAllowSpecificOrigins, policy => { // Permitimos explícitamente el origen de tu frontend (Vite) policy.WithOrigins("http://localhost:5173") .AllowAnyHeader() // Permitir cualquier encabezado .AllowAnyMethod(); // Permitir GET, POST, PUT, DELETE, etc. }); }); // ----------------------------------- builder.Services.AddSingleton(); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "Inventario API V1"); c.RoutePrefix = string.Empty; }); } app.UseHttpsRedirection(); // --- ACTIVAR EL MIDDLEWARE DE CORS --- // ¡IMPORTANTE! Debe ir ANTES de MapControllers y DESPUÉS de UseHttpsRedirection (si se usa) app.UseCors(MyAllowSpecificOrigins); // ---------------------------------------- app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run();