Skip to content

Commit

Permalink
TokenController organized
Browse files Browse the repository at this point in the history
  • Loading branch information
polatefekaya committed Jun 8, 2024
1 parent d4203ea commit dd69300
Show file tree
Hide file tree
Showing 4 changed files with 93 additions and 58 deletions.
59 changes: 2 additions & 57 deletions RosanicSocial.API/Controllers/v1/TokenController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,65 +30,10 @@ public TokenController(IJwtService jwtService, UserManager<ApplicationUser> user
/// <returns>New token values</returns>
[HttpPost]
public async Task<ActionResult<AuthenticationResponse>> GenerateNewAccessToken(TokenModel tokenmodel) {
_logger.LogInformation("GenerateNewAccessToken Controller is started");

if (tokenmodel == null) {
_logger.LogError("Invalid Client Request");
return BadRequest("Invalid Client Request");
}

string? jwtToken = tokenmodel.Token;
string? refreshToken = tokenmodel.RefreshToken;

ClaimsPrincipal? principal = _jwtService.GetClaimsPrincipal(jwtToken);
_logger.LogDebug("ClaimsPrincipal is setted");

if (principal == null) {
_logger.LogError($"Invalid JWT Access Token");
return BadRequest("Invalid JWT Access Token");
}

string? userName = principal.FindFirstValue(ClaimTypes.Name);
if (userName == null) {
_logger.LogError("No UserName Found");
return BadRequest("No UserName Found");
}
_logger.LogTrace($"UserName is extracted from ClaimPrinciples: {userName}");

ApplicationUser? user = await _userManager.FindByNameAsync(userName);
_logger.LogDebug("ApplicationUser is setted via UserManager");

bool isUserNull = user is null;
if (isUserNull) {
_logger.LogWarning($"{nameof(user)} is null");
_logger.LogTrace($"Searched UserName is {userName}");
return BadRequest("Invalid Jwt Token");
}

bool isRefreshTokensNotMatch = user.RefreshToken != tokenmodel.RefreshToken;
if (isRefreshTokensNotMatch) {
_logger.LogError("RefreshTokens not matching");
return BadRequest("Invalid RefreshToken");
}

bool isRefreshTokenExpired = user.RefreshTokenExpiration <= DateTime.UtcNow;

if (isRefreshTokenExpired) {
_logger.LogError("RefreshToken is Expired");
AuthenticationResponse? response = await _jwtService.GenerateNewAccessToken(tokenmodel);
if (response is null) {
return BadRequest("Invalid RefreshToken");
}

AuthenticationResponse response = _jwtService.CreateJwtToken(user.ToAuthRequest());
_logger.LogDebug("AuthenticationResponse is created");

user.RefreshToken = response.RefreshToken;
user.RefreshTokenExpiration = response.RefreshTokenExpiration;

_logger.LogTrace($"User RefreshToken: {response.RefreshToken}\nUser RefreshToken Expiration: {response.RefreshTokenExpiration}");

await _userManager.UpdateAsync(user);
_logger.LogDebug("User Manager updated the database with new data");

return Ok(response);
}
}
Expand Down
2 changes: 2 additions & 0 deletions RosanicSocial.Application/Interfaces/IJwtService.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using RosanicSocial.Domain.DTO.Request.Authentication;
using RosanicSocial.Domain.DTO.Response.Authentication;
using RosanicSocial.Domain.Models;
using System;
using System.Collections.Generic;
using System.Security.Claims;
Expand All @@ -8,5 +9,6 @@ namespace RosanicSocial.Application.Interfaces {
public interface IJwtService {
AuthenticationResponse CreateJwtToken(AuthenticationRequest request);
ClaimsPrincipal? GetClaimsPrincipal(string? token);
Task<AuthenticationResponse?> GenerateNewAccessToken(TokenModel model);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using RosanicSocial.Application.Interfaces;
using System;
using System.Collections.Generic;

namespace RosanicSocial.Application.Services.Background {
public class RefreshTokenCheckerService : BackgroundService {
private readonly ILogger<RefreshTokenCheckerService> _logger;
private readonly IJwtService _jwtService;
public RefreshTokenCheckerService(ILogger<RefreshTokenCheckerService> logger, IJwtService jwtService) {
_logger = logger;
_jwtService = jwtService;
}

protected override async Task ExecuteAsync(CancellationToken stoppingToken) {
//while (!stoppingToken.IsCancellationRequested) {
// await _jwtService.GenerateNewAccessToken();
//}
}
}
}
68 changes: 67 additions & 1 deletion RosanicSocial.Application/Services/JwtService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,23 @@
using System.Security.Cryptography;
using System.Text;
using Microsoft.Extensions.Logging;
using RosanicSocial.Domain.Models;
using Microsoft.AspNetCore.Identity;
using RosanicSocial.Domain.Data.Identity;

namespace RosanicSocial.Application.Services {
public class JwtService : IJwtService {
private readonly IConfiguration _configuration;
private readonly IJwtHelperService _jwtHelperService;

private readonly UserManager<ApplicationUser> _userManager;

private readonly ILogger<JwtService> _logger;
public JwtService(IConfiguration configuration, IJwtHelperService jwtHelperService, ILogger<JwtService> logger) {
public JwtService(IConfiguration configuration, IJwtHelperService jwtHelperService, ILogger<JwtService> logger, UserManager<ApplicationUser> userManager) {
_configuration = configuration;
_jwtHelperService = jwtHelperService;
_logger = logger;
_userManager = userManager;
}

public AuthenticationResponse CreateJwtToken(AuthenticationRequest request) {
Expand Down Expand Up @@ -63,6 +70,65 @@ public AuthenticationResponse CreateJwtToken(AuthenticationRequest request) {
};
}

public async Task<AuthenticationResponse?> GenerateNewAccessToken(TokenModel tokenModel) {
_logger.LogInformation("GenerateNewAccessToken Controller is started");

if (tokenModel is null) {
_logger.LogError("Invalid Client Request");
return null;
}

ClaimsPrincipal? principal = GetClaimsPrincipal(tokenModel.Token);
_logger.LogDebug("ClaimsPrincipal is setted");

if (principal is null) {
_logger.LogError($"Invalid JWT Access Token");
return null;
}

string? userName = principal.FindFirstValue(ClaimTypes.Name);
if (userName is null) {
_logger.LogError("No UserName Found");
return null;
}
_logger.LogTrace($"UserName is extracted from ClaimPrinciples: {userName}");

ApplicationUser? user = await _userManager.FindByNameAsync(userName);
_logger.LogDebug("ApplicationUser is setted via UserManager");

if (user is null) {
_logger.LogWarning($"{nameof(user)} is null");
_logger.LogTrace($"Searched UserName is {userName}");
return null;
}

bool isRefreshTokensNotMatch = user.RefreshToken != tokenModel.RefreshToken;
if (isRefreshTokensNotMatch) {
_logger.LogError("RefreshTokens not matching");
return null;
}

bool isRefreshTokenExpired = user.RefreshTokenExpiration <= DateTime.UtcNow;

if (isRefreshTokenExpired) {
_logger.LogError("RefreshToken is Expired");
return null;
}

AuthenticationResponse response = CreateJwtToken(user.ToAuthRequest());
_logger.LogDebug("AuthenticationResponse is created");

user.RefreshToken = response.RefreshToken;
user.RefreshTokenExpiration = response.RefreshTokenExpiration;

_logger.LogTrace($"User RefreshToken: {response.RefreshToken}\nUser RefreshToken Expiration: {response.RefreshTokenExpiration}");

await _userManager.UpdateAsync(user);
_logger.LogDebug("User Manager updated the database with new data");

return response;
}

public ClaimsPrincipal? GetClaimsPrincipal(string? token) {
if (token is null) {
_logger.LogError("Supplied token for GetClaimsPrincipal is null");
Expand Down

0 comments on commit dd69300

Please sign in to comment.