153 lines
6.5 KiB
C#
153 lines
6.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using Firebase.Auth;
|
|
using System.Timers;
|
|
|
|
namespace BodyshopPartner.Utils
|
|
{
|
|
public static class Auth
|
|
{
|
|
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
|
|
public static FirebaseAuthLink authlink;
|
|
static FirebaseAuthProvider ap = new FirebaseAuthProvider(new FirebaseConfig(Utils.AppMetaData.FirebaseAPIKey));
|
|
private static Timer tokenTimer = new Timer();
|
|
private static string U;
|
|
private static string P;
|
|
|
|
|
|
public async static Task AuthTest()
|
|
{
|
|
await ap.RefreshAuthAsync(new FirebaseAuth() { });
|
|
}
|
|
|
|
public async static Task<(bool, string)> AutoLogin(string AuthToken, string RefreshToken)
|
|
{
|
|
try
|
|
{
|
|
authlink = await new FirebaseAuthLink(ap, new FirebaseAuth() { FirebaseToken = AuthToken, RefreshToken = RefreshToken, }).GetFreshAuthAsync();
|
|
await authlink.RefreshUserDetails();
|
|
authlink.FirebaseAuthRefreshed += Authlink_FirebaseAuthRefreshed;
|
|
|
|
//logger.Trace("Firebase Auth Token {0}.", authlink.FirebaseToken);
|
|
// logger.Trace("Firebase Auth Token expires in {0} seconds.", authlink.ExpiresIn);
|
|
tokenTimer.Interval = (authlink.ExpiresIn - 600) * 1000; //Set the token to refresh 10 minutes before it has to.
|
|
logger.Trace("Refresh timer interval set to {0}ms", (authlink.ExpiresIn - 600) * 1000);
|
|
tokenTimer.Elapsed += TokenTimer_Tick;
|
|
tokenTimer.Start();
|
|
AppMetaData.user = Properties.Settings.Default.Username;
|
|
return (true, null);
|
|
}
|
|
catch (FirebaseAuthException Ex)
|
|
{
|
|
switch (Ex.Reason)
|
|
{
|
|
case AuthErrorReason.WrongPassword:
|
|
logger.Error("Incorrect password provided for user.");
|
|
return (false, Properties.Resources.Error_Login);
|
|
|
|
case AuthErrorReason.UnknownEmailAddress:
|
|
logger.Error("User does not exist.");
|
|
return (false, Properties.Resources.Error_Login);
|
|
case AuthErrorReason.TooManyAttemptsTryLater:
|
|
logger.Error("Too many attempts logging in.");
|
|
return (false, Properties.Resources.Error_Login_Attempts);
|
|
default:
|
|
logger.Error(Ex, "Unknown error occured while logging in. {0}", Ex.Reason);
|
|
return (false, Properties.Resources.Error_Login_Unknown);
|
|
}
|
|
}
|
|
catch (Exception Ex)
|
|
{
|
|
logger.Error(Ex, "Unknown error encountered while obtaining auth token.");
|
|
return (false, Properties.Resources.Error_Generic);
|
|
}
|
|
}
|
|
|
|
public async static Task<(bool, string)> LoginAsync(string Username, string Password)
|
|
{
|
|
U = Username;
|
|
P = Password;
|
|
try
|
|
{
|
|
authlink = await ap.SignInWithEmailAndPasswordAsync(Username, Password);
|
|
authlink.FirebaseAuthRefreshed += Authlink_FirebaseAuthRefreshed;
|
|
|
|
Properties.Settings.Default.AuthToken = authlink.FirebaseToken;
|
|
Properties.Settings.Default.RefreshToken = authlink.RefreshToken;
|
|
Properties.Settings.Default.Save();
|
|
|
|
|
|
|
|
// logger.Trace("Firebase Auth Token {0}.", authlink.FirebaseToken);
|
|
// logger.Trace("Firebase Auth Token expires in {0} seconds.", authlink.ExpiresIn);
|
|
tokenTimer.Interval = (authlink.ExpiresIn - 600) * 1000; //Set the token to refresh 10 minutes before it has to.
|
|
logger.Trace("Refresh timer interval set to {0}ms", (authlink.ExpiresIn - 600) * 1000);
|
|
tokenTimer.Elapsed += TokenTimer_Tick;
|
|
tokenTimer.Start();
|
|
|
|
AppMetaData.user = Username;
|
|
return (true, null);
|
|
}
|
|
catch (FirebaseAuthException Ex)
|
|
{
|
|
switch (Ex.Reason)
|
|
{
|
|
case AuthErrorReason.WrongPassword:
|
|
logger.Error("Incorrect password provided for user.");
|
|
return (false, Properties.Resources.Error_Login);
|
|
|
|
case AuthErrorReason.UnknownEmailAddress:
|
|
logger.Error("User does not exist.");
|
|
return (false, Properties.Resources.Error_Login);
|
|
case AuthErrorReason.TooManyAttemptsTryLater:
|
|
logger.Error("Too many attempts logging in.");
|
|
return (false, Properties.Resources.Error_Login_Attempts);
|
|
default:
|
|
logger.Error(Ex, "Unknown error occured while logging in.");
|
|
return (false, Properties.Resources.Error_Login_Unknown);
|
|
}
|
|
}
|
|
catch (Exception Ex)
|
|
{
|
|
logger.Error(Ex, "Unknown error encountered while obtaining auth token.");
|
|
return (false, Properties.Resources.Error_Generic);
|
|
}
|
|
}
|
|
|
|
public static async Task Refresh()
|
|
{
|
|
//logger.Trace("Old Token {0}", authlink.RefreshToken);
|
|
await authlink.GetFreshAuthAsync();
|
|
|
|
authlink = await ap.RefreshAuthAsync(authlink);
|
|
// logger.Trace("new Token {0}", authlink.FirebaseToken);
|
|
}
|
|
|
|
private static void Authlink_FirebaseAuthRefreshed(object sender, FirebaseAuthEventArgs e)
|
|
{
|
|
// logger.Debug("Auth token refreshed!");
|
|
// logger.Debug("New token: {0}", e.FirebaseAuth.FirebaseToken);
|
|
}
|
|
|
|
private static async Task RefreshToken()
|
|
{
|
|
//Gotta do some stuff now that i got a new token!
|
|
//Maybe the token auto refreshes?
|
|
// logger.Info("Timer Old Token {0}", authlink.FirebaseToken);
|
|
authlink = await authlink.GetFreshAuthAsync();
|
|
// logger.Info("new Token {0}", authlink.FirebaseToken);
|
|
tokenTimer.Stop();
|
|
tokenTimer.Interval = (authlink.ExpiresIn - 600) * 1000; //Set the token to refresh 10 minutes before it has to.
|
|
tokenTimer.Start();
|
|
}
|
|
|
|
private static async void TokenTimer_Tick(object sender, ElapsedEventArgs e)
|
|
{
|
|
await RefreshToken();
|
|
}
|
|
}
|
|
}
|