This commit is contained in:
jozsef.b@aycode.com 2023-11-29 11:33:34 +01:00
parent b520acd675
commit 3de771f1a9
1 changed files with 64 additions and 62 deletions

View File

@ -32,8 +32,8 @@ namespace TIAMWebApp.Server.Controllers
private UserDal _userDal; private UserDal _userDal;
private readonly IConfiguration _configuration; private readonly IConfiguration _configuration;
private readonly IWebHostEnvironment _webHostEnvironment; private readonly IWebHostEnvironment _webHostEnvironment;
PasswordHasher hasher = new PasswordHasher(); readonly PasswordHasher _hasher = new();
/*private UserModel[] users = new UserModel[] /*private UserModel[] users = new UserModel[]
{ {
@ -48,7 +48,7 @@ namespace TIAMWebApp.Server.Controllers
{ {
_logger = logger; _logger = logger;
_configuration = configuration; _configuration = configuration;
_webHostEnvironment = webHostEnvironment; _webHostEnvironment = webHostEnvironment;
_userDal = userDal; _userDal = userDal;
} }
@ -77,9 +77,9 @@ namespace TIAMWebApp.Server.Controllers
{ {
return Unauthorized(); return Unauthorized();
} }
else else
{ {
bool isValidUser = false; var isValidUser = false;
if (dbUser.Password == authenticateUser.Password) if (dbUser.Password == authenticateUser.Password)
{ {
@ -91,7 +91,7 @@ namespace TIAMWebApp.Server.Controllers
if (isValidUser) if (isValidUser)
{ {
Console.WriteLine("UserModel authenticated, let's start JWT"); Console.WriteLine("UserModel authenticated, let's start JWT");
string accessToken = GenerateAccessToken(dbUser); var accessToken = GenerateAccessToken(dbUser);
Console.WriteLine("Generate refresh token"); Console.WriteLine("Generate refresh token");
var refreshToken = GenerateRefreshToken(); var refreshToken = GenerateRefreshToken();
dbUser.RefreshToken = refreshToken; dbUser.RefreshToken = refreshToken;
@ -115,23 +115,23 @@ namespace TIAMWebApp.Server.Controllers
return Unauthorized(); return Unauthorized();
} }
} }
} }
private string GenerateAccessToken(User user) private string GenerateAccessToken(User user)
{ {
var tokenHandler = new JwtSecurityTokenHandler(); var tokenHandler = new JwtSecurityTokenHandler();
var token = new JwtSecurityToken();
Console.WriteLine("----------------------------------------------------------"); Console.WriteLine("----------------------------------------------------------");
var keyDetail = Encoding.UTF8.GetBytes(_configuration["JWT:Key"]);
if (_configuration["JWT:Key"] == null)
throw new SecurityTokenException("Token is null");
var keyDetail = Encoding.UTF8.GetBytes(_configuration["JWT:Key"] ?? string.Empty);
Console.WriteLine(_configuration["JWT:Key"]); Console.WriteLine(_configuration["JWT:Key"]);
var claims = new List<Claim> var claims = new List<Claim>
{ {
new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()), new(ClaimTypes.NameIdentifier, user.Id.ToString()),
new Claim(ClaimTypes.Email, user.Email) new(ClaimTypes.Email, user.Email)
}; };
var tokenDescriptor = new SecurityTokenDescriptor var tokenDescriptor = new SecurityTokenDescriptor
@ -142,18 +142,21 @@ namespace TIAMWebApp.Server.Controllers
Subject = new ClaimsIdentity(claims), Subject = new ClaimsIdentity(claims),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(keyDetail), SecurityAlgorithms.HmacSha256Signature) SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(keyDetail), SecurityAlgorithms.HmacSha256Signature)
}; };
token = tokenHandler.CreateToken(tokenDescriptor) as JwtSecurityToken;
string writtenToken = tokenHandler.WriteToken(token); var token = tokenHandler.CreateToken(tokenDescriptor) as JwtSecurityToken;
var writtenToken = tokenHandler.WriteToken(token);
Console.WriteLine(writtenToken); Console.WriteLine(writtenToken);
return writtenToken; return writtenToken;
} }
[AllowAnonymous] [AllowAnonymous]
[HttpPost] [HttpPost]
[Route("RefreshToken")] [Route("RefreshToken")]
public async Task<IActionResult> RefreshToken(RefreshTokenRequest refreshTokenRequest) public async Task<IActionResult> RefreshToken(RefreshTokenRequest? refreshTokenRequest)
{ {
Console.WriteLine("RefreshToken called"); Console.WriteLine("RefreshToken called");
var response = new MainResponse(); var response = new MainResponse();
if (refreshTokenRequest is null) if (refreshTokenRequest is null)
{ {
@ -190,9 +193,9 @@ namespace TIAMWebApp.Server.Controllers
return BadRequest(response); return BadRequest(response);
} }
string newAccessToken = GenerateAccessToken(dbUser); var newAccessToken = GenerateAccessToken(dbUser);
string refreshToken = GenerateRefreshToken(); var refreshToken = GenerateRefreshToken();
//mocking - update userModel with new refreshToken //mocking - update userModel with new refreshToken
dbUser.RefreshToken = refreshToken; dbUser.RefreshToken = refreshToken;
//TODO await _userManager.UpdateAsync(userModel); //TODO await _userManager.UpdateAsync(userModel);
@ -204,21 +207,22 @@ namespace TIAMWebApp.Server.Controllers
RefreshToken = refreshToken, RefreshToken = refreshToken,
AccessToken = newAccessToken AccessToken = newAccessToken
}; };
return Ok(response); return Ok(response);
} }
else
{
Console.WriteLine("Principal is null");
return NotFound("Invalid Token Found");
}
Console.WriteLine("Principal is null");
return NotFound("Invalid Token Found");
} }
private ClaimsPrincipal GetPrincipalFromExpiredToken(string token) private ClaimsPrincipal GetPrincipalFromExpiredToken(string token)
{ {
var tokenHandler = new JwtSecurityTokenHandler(); var tokenHandler = new JwtSecurityTokenHandler();
var keyDetail = Encoding.UTF8.GetBytes(_configuration["JWT:Key"]); if (_configuration["JWT:Key"] == null)
throw new SecurityTokenException("Token is null");
var keyDetail = Encoding.UTF8.GetBytes(_configuration["JWT:Key"] ?? string.Empty);
var tokenValidationParameter = new TokenValidationParameters var tokenValidationParameter = new TokenValidationParameters
{ {
@ -231,11 +235,11 @@ namespace TIAMWebApp.Server.Controllers
IssuerSigningKey = new SymmetricSecurityKey(keyDetail), IssuerSigningKey = new SymmetricSecurityKey(keyDetail),
}; };
SecurityToken securityToken; var principal = tokenHandler.ValidateToken(token, tokenValidationParameter, out var securityToken);
var principal = tokenHandler.ValidateToken(token, tokenValidationParameter, out securityToken);
var jwtSecurityToken = securityToken as JwtSecurityToken; if (securityToken is not JwtSecurityToken jwtSecurityToken || !jwtSecurityToken.Header.Alg.Equals(SecurityAlgorithms.HmacSha256, StringComparison.InvariantCultureIgnoreCase))
if (jwtSecurityToken == null || !jwtSecurityToken.Header.Alg.Equals(SecurityAlgorithms.HmacSha256, StringComparison.InvariantCultureIgnoreCase))
throw new SecurityTokenException("Invalid token"); throw new SecurityTokenException("Invalid token");
return principal; return principal;
} }
@ -257,56 +261,54 @@ namespace TIAMWebApp.Server.Controllers
public async Task<IActionResult> CreateUser([FromBody] JsonElement SerializedRegistrationModel) public async Task<IActionResult> CreateUser([FromBody] JsonElement SerializedRegistrationModel)
{ {
Console.WriteLine("CreateUser called"); Console.WriteLine("CreateUser called");
if (string.IsNullOrEmpty(SerializedRegistrationModel.GetRawText())) if (string.IsNullOrEmpty(SerializedRegistrationModel.GetRawText()))
{ {
return BadRequest("SerializedLoginModel is required"); return BadRequest("SerializedLoginModel is required");
} }
else else
{ {
RegistrationModel? user = JObject.Parse(SerializedRegistrationModel.GetRawText()).ToObject<RegistrationModel>(); var user = JObject.Parse(SerializedRegistrationModel.GetRawText()).ToObject<RegistrationModel>();
if (user != null)
if(user != null) {
//add userModel to users array
//Array.Resize(ref users, users.Length + 1);
//users[users.Length - 1] = new UserModel(user.Email, user.PhoneNumber, user.Password);
var userId = Guid.NewGuid();
var email = user?.Email;
var phoneNumber = user?.PhoneNumber;
var password = user?.Password;
if (email is null || phoneNumber is null || password is null)
{ {
//add userModel to users array return BadRequest("Invalid request");
//Array.Resize(ref users, users.Length + 1); }
//users[users.Length - 1] = new UserModel(user.Email, user.PhoneNumber, user.Password); else
{
Console.WriteLine($"User to be created: {userId}");
Console.WriteLine($"User to be created: {email}");
Console.WriteLine($"User to be created: {phoneNumber}");
Console.WriteLine($"User to be created: {password}");
await _userDal.CreateUserAsync(new User(userId, email, phoneNumber, password));
}
}
var userId = Guid.NewGuid(); return Ok("yes");
string? email = user?.Email;
string? phoneNumber = user?.PhoneNumber;
string? password = user?.Password;
if(email is null || phoneNumber is null || password is null)
{
return BadRequest("Invalid request");
}
else
{
Console.WriteLine($"User to be created: {userId}");
Console.WriteLine($"User to be created: {email}");
Console.WriteLine($"User to be created: {phoneNumber}");
Console.WriteLine($"User to be created: {password}");
await _userDal.CreateUserAsync(new User(userId, email, phoneNumber, password));
}
}
return Ok("yes");
} }
} }
[HttpPost] [HttpPost]
[Route("Test1")] [Route("Test1")]
public async Task<IActionResult> TestEndpoint([FromBody] int testParam) public async Task<IActionResult> TestEndpoint([FromBody] int testParam)
{ {
return Ok(testParam.ToString()); return Ok(testParam.ToString());
} }
[HttpGet] [HttpGet]
[Route("Test2")] [Route("Test2")]
public string TestEndpoint2(int testParam) public string TestEndpoint2(int testParam)
@ -345,13 +347,13 @@ namespace TIAMWebApp.Server.Controllers
private bool VerifyPassword(string password, string hashedPassword) private bool VerifyPassword(string password, string hashedPassword)
{ {
bool isPasswordValid = hasher.VerifyPassword(password, hashedPassword); var isPasswordValid = _hasher.VerifyPassword(password, hashedPassword);
return isPasswordValid; return isPasswordValid;
} }
private string HashPassword(string password) private string HashPassword(string password)
{ {
var hashedPassword = hasher.HashPassword(password); var hashedPassword = _hasher.HashPassword(password);
return hashedPassword; return hashedPassword;
} }
} }