using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; namespace CityInfo.API.Controllers { [Route("api/authentication")] [ApiController] public class AuthenticationController : ControllerBase { private readonly IConfiguration _configuration; public class AuthenticationRequestBody { public string? UserName { get; set; } public string? Password { get; set; } } internal class CityInfoUser { public int UserId { get; set; } public string UserName { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string City { get; set; } public CityInfoUser( int userId, string userName, string firstName, string lastName, string city) { UserId = userId; UserName = userName; FirstName = firstName; LastName = lastName; City = city; } } public AuthenticationController(IConfiguration configuration) { _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); } [HttpPost("authenticate")] public ActionResult Authenticate(AuthenticationRequestBody authenticationRequestBody) { var user = ValidateUserCredentials(authenticationRequestBody.UserName, authenticationRequestBody.Password); if (user == null) { return Unauthorized(); } var securityKey = new SymmetricSecurityKey(Convert.FromBase64String(_configuration["Authentication:SecretForKey"])); var signingCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256); var claimsForToken = new List { new Claim("sub", user.UserId.ToString()), new Claim("given_name", user.FirstName), new Claim("family_name", user.LastName), new Claim("city", user.City) }; var jwtSecurityToken = new JwtSecurityToken( _configuration["Authentication:Issuer"], _configuration["Authentication:Audience"], claimsForToken, DateTime.UtcNow, DateTime.UtcNow.AddHours(1), signingCredentials); var tokenToReturn = new JwtSecurityTokenHandler().WriteToken(jwtSecurityToken); return Ok(tokenToReturn); } private CityInfoUser ValidateUserCredentials(string? userName, string? password) { return new CityInfoUser( 1, userName ?? "", "Nathan", "Pire", "Charleroi"); } } }