using Microsoft.AspNetCore.Mvc; using Microsoft.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Security.Cryptography; namespace HyperBooru.Controllers; [ApiController] [Route("/api/auth")] public class ApiLoginController : Controller { private readonly RSA rsa; public ApiLoginController(RSA rsa) => this.rsa = rsa; [HttpPost] public IActionResult Login([FromBody] LoginRequest request) { var claims = new[] { new Claim(ClaimTypes.Name, request.Username), // TODO: Populate with the user's actual GUID new Claim("uid", Guid.Empty.ToString().ToLower()), new Claim("nsfw", request.NsfwClaim.ToString().ToLower()) }; var creds = new SigningCredentials( new RsaSecurityKey(rsa), SecurityAlgorithms.RsaSha256); var token = new JwtSecurityToken( claims: claims, expires: DateTime.UtcNow.AddDays(30), signingCredentials: creds); var jwt = new JwtSecurityTokenHandler().WriteToken(token); return Ok(new { token = jwt }); } public record LoginRequest { public required string Username { get; set; } public required string Password { get; set; } public bool NsfwClaim { get; set; } = false; } }