|
|
|
|
|
|
|
|
private readonly UserManager<User> _userManager; |
|
|
private readonly UserManager<User> _userManager; |
|
|
private readonly DatabaseContext _databaseContext; |
|
|
private readonly DatabaseContext _databaseContext; |
|
|
private readonly IEmailer _emailer; |
|
|
private readonly IEmailer _emailer; |
|
|
|
|
|
private readonly IMapper _mapper; |
|
|
private readonly ILogger<AuthenticationService> _logger; |
|
|
private readonly ILogger<AuthenticationService> _logger; |
|
|
private readonly IHttpClientService _httpClient; |
|
|
private readonly IHttpClientService _httpClient; |
|
|
|
|
|
|
|
|
public AuthenticationService(IOptions<AuthorizationSettings> authSettings, |
|
|
|
|
|
IOptions<FrontEndSettings> frontEndSettings, |
|
|
|
|
|
UserManager<User> userManager, |
|
|
|
|
|
DatabaseContext databaseContext, |
|
|
|
|
|
IEmailer emailer, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public AuthenticationService(IOptions<AuthorizationSettings> authSettings, |
|
|
|
|
|
IOptions<FrontEndSettings> frontEndSettings, |
|
|
|
|
|
UserManager<User> userManager, |
|
|
|
|
|
DatabaseContext databaseContext, |
|
|
|
|
|
IEmailer emailer, |
|
|
ILogger<AuthenticationService> logger, |
|
|
ILogger<AuthenticationService> logger, |
|
|
IHttpClientService httpClient) |
|
|
|
|
|
|
|
|
IHttpClientService httpClient, |
|
|
|
|
|
IMapper mapper) |
|
|
{ |
|
|
{ |
|
|
_authSettings = authSettings.Value; |
|
|
_authSettings = authSettings.Value; |
|
|
_frontEndSettings = frontEndSettings.Value; |
|
|
_frontEndSettings = frontEndSettings.Value; |
|
|
|
|
|
|
|
|
_httpClient = httpClient; |
|
|
_httpClient = httpClient; |
|
|
_emailer = emailer; |
|
|
_emailer = emailer; |
|
|
_logger = logger; |
|
|
_logger = logger; |
|
|
|
|
|
_mapper = mapper; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public async Task<ServiceResponseDTO<AuthenticateResponseDto>> Authenticate(AuthenticateRequestDto model) |
|
|
public async Task<ServiceResponseDTO<AuthenticateResponseDto>> Authenticate(AuthenticateRequestDto model) |
|
|
{ |
|
|
{ |
|
|
_logger.LogInformation($"Checking credentials for user: {model.Username}"); |
|
|
|
|
|
|
|
|
_logger.LogError($"Checking credentials for user: {model.Username}"); |
|
|
var user = await _userManager.FindByNameAsync(model.Username); |
|
|
var user = await _userManager.FindByNameAsync(model.Username); |
|
|
|
|
|
|
|
|
// return null if user not found |
|
|
// return null if user not found |
|
|
|
|
|
|
|
|
// return null if user is disabled |
|
|
// return null if user is disabled |
|
|
if (user.IsEnabled == false) |
|
|
if (user.IsEnabled == false) |
|
|
{ |
|
|
{ |
|
|
_logger.LogInformation($"User: {model.Username} is not enabled"); |
|
|
|
|
|
|
|
|
_logger.LogError($"User: {model.Username} is not enabled"); |
|
|
return new ServiceResponseDTO<AuthenticateResponseDto> |
|
|
return new ServiceResponseDTO<AuthenticateResponseDto> |
|
|
{ |
|
|
{ |
|
|
IsError = true, |
|
|
IsError = true, |
|
|
|
|
|
|
|
|
// password is not correct |
|
|
// password is not correct |
|
|
if (!result) |
|
|
if (!result) |
|
|
{ |
|
|
{ |
|
|
_logger.LogInformation($"Password for user: {model.Username} is not correct"); |
|
|
|
|
|
|
|
|
_logger.LogError($"Password for user: {model.Username} is not correct"); |
|
|
await _userManager.AccessFailedAsync(user); |
|
|
await _userManager.AccessFailedAsync(user); |
|
|
|
|
|
|
|
|
return new ServiceResponseDTO<AuthenticateResponseDto> |
|
|
return new ServiceResponseDTO<AuthenticateResponseDto> |
|
|
|
|
|
|
|
|
}; |
|
|
}; |
|
|
} |
|
|
} |
|
|
var token = await GenerateToken(user); |
|
|
var token = await GenerateToken(user); |
|
|
_logger.LogInformation($"Successfull login token: {token}"); |
|
|
|
|
|
|
|
|
_logger.LogError($"Successfull login token: {token}"); |
|
|
return token; |
|
|
return token; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public async Task<ServiceResponseDTO<AuthenticateResponseDto>> Authenticate(GoogleApiModel model) |
|
|
public async Task<ServiceResponseDTO<AuthenticateResponseDto>> Authenticate(GoogleApiModel model) |
|
|
{ |
|
|
{ |
|
|
_logger.LogInformation($"Checking token for google login {model.Token}"); |
|
|
|
|
|
|
|
|
_logger.LogError($"Checking token for google login {model.Token}"); |
|
|
if (!(await _httpClient.IsTokenValid(model.Token))) |
|
|
if (!(await _httpClient.IsTokenValid(model.Token))) |
|
|
{ |
|
|
{ |
|
|
_logger.LogError($"Token is not valid"); |
|
|
_logger.LogError($"Token is not valid"); |
|
|
|
|
|
|
|
|
ErrorMessage = "Invalid Google Api Token" |
|
|
ErrorMessage = "Invalid Google Api Token" |
|
|
}; |
|
|
}; |
|
|
} |
|
|
} |
|
|
_logger.LogInformation($"Checking if user exists in Db with email : {model.User.email}"); |
|
|
|
|
|
|
|
|
_logger.LogError($"Checking if user exists in Db with email : {model.User.email}"); |
|
|
var user = await _userManager.FindByEmailAsync(model.User.email); |
|
|
var user = await _userManager.FindByEmailAsync(model.User.email); |
|
|
|
|
|
|
|
|
// return null if user not found |
|
|
// return null if user not found |
|
|
|
|
|
|
|
|
ErrorMessage = errors.First() |
|
|
ErrorMessage = errors.First() |
|
|
}; |
|
|
}; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public async Task<ServiceResponseDTO<object>> Register(RegisterDTO model) |
|
|
|
|
|
{ |
|
|
|
|
|
_logger.LogInformation($"User with email: {model.Email} is going to register."); |
|
|
|
|
|
var user = await _userManager.FindByEmailAsync(model.Email); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (user == null) |
|
|
|
|
|
{ |
|
|
|
|
|
_logger.LogInformation($"User with email: {model.Email} not found."); |
|
|
|
|
|
return new ServiceResponseDTO<object> |
|
|
|
|
|
{ |
|
|
|
|
|
IsError = true, |
|
|
|
|
|
ErrorMessage = "User not invited." |
|
|
|
|
|
}; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
_logger.LogInformation($"Found user: {user.FirstName} {user.LastName}"); |
|
|
|
|
|
_mapper.Map<RegisterDTO, User>(model, user); |
|
|
|
|
|
|
|
|
|
|
|
_logger.LogInformation($"Enabled login for user: {user.FirstName} {user.LastName}"); |
|
|
|
|
|
user.IsEnabled = true; |
|
|
|
|
|
IdentityResult resetResult = await _userManager.ResetPasswordAsync(user, HttpUtility.UrlDecode(model.Token), model.Password); |
|
|
|
|
|
|
|
|
|
|
|
if (resetResult.Succeeded) |
|
|
|
|
|
{ |
|
|
|
|
|
_logger.LogInformation($"Succesfuly registered user: {user.FirstName} {user.LastName}"); |
|
|
|
|
|
await _databaseContext.SaveChangesAsync(); |
|
|
|
|
|
//_logger.LogInformation($"Password for user : {model.Email} changed successfully"); |
|
|
|
|
|
return new ServiceResponseDTO<object> { Data = true }; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var errors = resetResult.Errors.Select(x => x.Description); |
|
|
|
|
|
return new ServiceResponseDTO<object> |
|
|
|
|
|
{ |
|
|
|
|
|
IsError = true, |
|
|
|
|
|
ErrorMessage = errors.First() |
|
|
|
|
|
}; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |