Project/Project.Application/Services/TwoFactorAuthService.cs

98 lines
3.4 KiB
C#

using Google.Authenticator;
using Microsoft.Extensions.Options;
using Project.Application.DTOs.TwoFactorAuth;
using Project.Application.Interfaces;
using Project.Application.Options;
using Project.Infrastructure.Interfaces;
namespace Project.Application.Services
{
public class TwoFactorAuthService : ITwoFactorAuthService
{
// FIELDS FOR CTOR
private readonly TwoFactorAuthenticator _twoFactorAuthenticator;
private readonly ITwoFactorAuthRepository _twoFactorAuthRepository;
private readonly string _issuer;
// CTOR
public TwoFactorAuthService(IOptions<AuthOptions> options, ITwoFactorAuthRepository twoFactorAuthRepository)
{
_twoFactorAuthenticator = new TwoFactorAuthenticator();
_twoFactorAuthRepository = twoFactorAuthRepository;
_issuer = options.Value.Issuer;
}
//public void TwoFactorAuthenticatorMethods()
//{
// _twoFactorAuthenticator.Equals();
// _twoFactorAuthenticator.GeneratePINAtInterval();
// _twoFactorAuthenticator.GenerateSetupCode();
// _twoFactorAuthenticator.GetCurrentPIN();
// _twoFactorAuthenticator.GetCurrentPINs();
// _twoFactorAuthenticator.GetHashCode();
// _twoFactorAuthenticator.GetType();
// _twoFactorAuthenticator.ToString();
// _twoFactorAuthenticator.ValidateTwoFactorPIN();
//}
// GENERATE TWO FACTOR AUTH SETUP
public async Task<TwoFactorSetupDto> GenerateSetupCodeAsync(string userEmail)
{
var userSecretKey = Guid.NewGuid().ToString();
var setupInfo = _twoFactorAuthenticator.GenerateSetupCode(
_issuer, // Envelope.Configuration.ApplicationName
userEmail, // user.Email
userSecretKey,
false,
10);
string manualEntryKey = setupInfo.ManualEntryKey;
string qrCodeImageUrl = setupInfo.QrCodeSetupImageUrl;
await _twoFactorAuthRepository.SaveSecretKeyAsync(userEmail, userSecretKey);
return new TwoFactorSetupDto
{
SecretKey = userSecretKey,
QrCodeImageUrl = qrCodeImageUrl,
ManualEntryKey = manualEntryKey
};
}
// VALIDATE OTP
public async Task<bool> ValidateCodeAsync(string userEmail, string userInputCode)
{
var secretKey = await _twoFactorAuthRepository.GetSecretKeyAsync(userEmail);
if (string.IsNullOrEmpty(secretKey))
{
throw new InvalidOperationException("Secret key not found!");
}
return _twoFactorAuthenticator.ValidateTwoFactorPIN(secretKey, userInputCode);
}
//// SAVE SECRET KEY
//public async Task SaveSecretKeyAsync(string userEmail, string userSecretKey)
//{
// var user = await _twoFactorAuthRepository.GetUserByEmailAsync(userEmail);
// if (user == null)
// {
// throw new InvalidOperationException("User not found!");
// }
// await _twoFactorAuthRepository.SaveSecretKeyAsync(userEmail, userSecretKey);
//}
// GET SECRET KEY
public async Task<string> GetSecretKeyAsync(string userEmail)
{
var secretKey = await _twoFactorAuthRepository.GetSecretKeyAsync(userEmail);
return secretKey;
}
}
}