Untitled
unknown
csharp
2 months ago
13 kB
17
Indexable
using NetworkBrid;
using Newtonsoft.Json.Linq;
using Save;
using StudioCore;
using System;
using System.Text;
using UI;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Networking;
using Utils;
namespace Security
{
public class Authorization : InitBehaviour, IAuth
{
[SerializeField] private AuthStatus authStatus;
[SerializeField] private string baseUrl;
[Header("Login test credentials & testing")]
public string email;
public string password;
public string sceneName;
public string testResult;
private string REFRESH_TOKEN_API = "/api/refreshToken";
private string LOGIN_API = "/api/login";
private string SCENE_API = "/api/v2/saves/";
private UnityWebRequest activeRequest;
private IRest Rest;
private ILoader Loader;
private ISave Saver;
private ILoadView LoadView;
private INetworkUtilsSender UtilsSender;
[ContextMenu("Simulate login")]
public void SimulateLogin()
{
Login(email, password, (resposne) => LoadInitData(resposne.text, sceneName), (errorCode) => Debug.LogError(errorCode), true);
}
public override void Install(IInstalator Installator)
{
base.Install(Installator);
Rest = Installator.Install<IRest>();
Loader = Installator.Install<ILoader>();
Saver = Installator.Install<ISave>();
LoadView = Installator.Install<ILoadView>();
UtilsSender = Installator.Install<INetworkUtilsSender>();
}
public void Login(string email, string password, UnityAction<DownloadHandler> OnLoginSuccesfulled, UnityAction<string> OnLoginFailed, bool loadSceneOnInit)
{
Debug.Log($"<color=orange>Begin login attempt</color>");
JProperty emailProp = new JProperty("email", email);
JProperty passwordProp = new JProperty("password", password);
JObject loginData = new JObject(emailProp, passwordProp);
authStatus.httpOrigin = baseUrl;
UnityAction<DownloadHandler> LoadInitDataAction = (dh) =>
{
LoadInitData(dh.text, sceneName, false);
};
OnLoginSuccesfulled += LoadInitDataAction;
Rest.Request(CustomPostAuthRequest(LOGIN_API, loginData.ToString()), OnLoginSuccesfulled, OnLoginFailed);
}
public void Login(string email, string password, UnityAction OnLoginSuccesfulled, UnityAction OnLoginFailed, bool loadSceneOnInit)
{
Debug.Log($"<color=orange>Begin login attempt</color>");
JProperty emailProp = new JProperty("email", email);
JProperty passwordProp = new JProperty("password", password);
JObject loginData = new JObject(emailProp, passwordProp);
authStatus.httpOrigin = baseUrl;
UnityAction<DownloadHandler> LoadInitDataAction = (dh) =>
{
LoadInitData(dh.text, sceneName, false);
};
LoadInitDataAction += (dh) => OnLoginSuccesfulled?.Invoke();
Rest.Request(CustomPostAuthRequest(LOGIN_API, loginData.ToString()), LoadInitDataAction, (str) => OnLoginFailed?.Invoke());
}
public void LoadInitData(string loginData, string overrideSaveId = "", bool loadSceneOnInit = true)
{
LoadView.DisplayLoad(LoadingType.GameLoading);
authStatus = JsonUtility.FromJson<AuthStatus>(loginData);
authStatus.httpOrigin = (authStatus.httpOrigin != null && authStatus.httpOrigin != string.Empty) ? authStatus.httpOrigin : baseUrl;
Values.GeneralValues.DEFAULT_HTTP_ORIGIN = authStatus.httpOrigin;
authStatus.saveID = overrideSaveId != string.Empty ? overrideSaveId : authStatus.saveID;
if (authStatus != null)
{
if(loadSceneOnInit)
{
UnityAction<string> OnSceneDataReceived = (data) =>
{
if (data != string.Empty)
{
LoadView.HideLoad(LoadingType.GameLoading);
Loader.LoadStructure(data);
Debug.Log($"<color=green>Succesfull logged int</color>");
}
else
{
LoadView.HideLoad(LoadingType.GameLoading);
Debug.LogError($"Authorization :: Cannot load authorized load. Cannot parse response into JObject format");
}
};
if(authStatus.saveApiOverride != string.Empty)
{
GetAuthorizedScene(authStatus.saveID, authStatus.saveApiOverride, OnSceneDataReceived, (errorCode) =>
{
Debug.LogError($"Cannot get authorized scene. Error code {errorCode}");
LoadView.HideLoad(LoadingType.GameLoading);
});
}
else
{
GetAuthorizedScene(authStatus.saveID, OnSceneDataReceived, (errorCode) =>
{
Debug.LogError($"Cannot get authorized scene. Error code {errorCode}");
LoadView.HideLoad(LoadingType.GameLoading);
});
}
}
}
else
{
LoadView.HideLoad(LoadingType.GameLoading);
Debug.LogError("Failed to parse initialization data to proper structure");
}
}
public void GetAuthorizedScene(string sceneName, UnityAction<string> OnSuccess, UnityAction<string> OnFailed)
{
UnityAction GetAuthorizedScene = () =>
{
Rest.Request(CustomGetAuth($"{SCENE_API + sceneName}"), (handler) => OnSuccess?.Invoke(handler.text), OnFailed);
};
ValidateToken(GetAuthorizedScene, OnFailed);
}
public void GetAuthorizedScene(string sceneName, string saveApiOverride, UnityAction<string> OnSuccess, UnityAction<string> OnFailed)
{
UnityAction GetAuthorizedScene = () =>
{
Rest.Request(CustomGetAuth($"{saveApiOverride + sceneName}"), (handler) => OnSuccess?.Invoke(handler.text), OnFailed);
};
ValidateToken(GetAuthorizedScene, OnFailed);
}
public void SaveAuthorizedScene(string sceneName, string scenePayload, UnityAction<string, bool> OnSaveCallback)
{
UnityAction SaveAuthorizedScene = () =>
{
Rest.Request(CustomPostAuthRequest($"{SCENE_API + sceneName}", scenePayload), (handler) => OnSaveCallback?.Invoke(handler.text, true), (errorCode) => OnSaveCallback?.Invoke(errorCode, false));
};
ValidateToken(SaveAuthorizedScene, (error) => Debug.LogError($"Failded to authorize token during scene Save {error}"));
}
[ContextMenu("Save Scene")]
public void SaveAuthorizedScene()
{
SaveAuthorizedScene(authStatus.saveID, Saver.SaveOb().ToString(), (payload, success) => { });
}
public void ValidateToken(UnityAction OnTokenValidated, UnityAction<string> OnTokenValidationFailed)
{
long currentSeconds = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
bool dateIsValid = authStatus.accessTokenExpirationTime > currentSeconds;
if (dateIsValid)
{
OnTokenValidated?.Invoke();
}
else
{
Debug.Log("<color=red> Token is no longer valid. Attemp to refresh it</color>");
JProperty emailProp = new JProperty("email", authStatus.user.email);
JProperty refreshProp = new JProperty("refreshToken", authStatus.refreshToken);
JObject loginData = new JObject(emailProp, refreshProp);
UnityAction<DownloadHandler> OnTokenSuccesfullRefresh = (refreshedToken) =>
{
TokenRefreshModel refresh = JsonUtility.FromJson<TokenRefreshModel>(refreshedToken.text);
if (refresh == null)
{
OnTokenValidationFailed?.Invoke($"Received refresh data but it's corrupted. Cannop parse into TokenModel. Data -> {refreshedToken}");
UtilsSender.LogoutImmidiately();
return;
}
authStatus.accessToken = refresh.accessToken;
authStatus.refreshToken = refresh.refreshToken;
authStatus.accessTokenExpirationTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds() + refresh.expiresIn;
OnTokenValidated?.Invoke();
Debug.Log("<color=green> Token succesfully refreshed</color>");
};
UnityAction<string> OnTokenRefreshFailed = (errorCode) =>
{
OnTokenValidationFailed?.Invoke($"Error: {errorCode}. Token refresh was unsuccesfull. Clearing up the data");
authStatus = null;
UtilsSender.LogoutImmidiately();
};
Rest.Request(CustomPostAuthRequest(REFRESH_TOKEN_API, loginData.ToString()), OnTokenSuccesfullRefresh, OnTokenRefreshFailed);
}
}
[ContextMenu("Validate Token")]
public void TestTokenValidation()
{
ValidateToken(() => Debug.Log("TokenValid"), (errorCode) => Debug.Log($"Token validation failed with code {errorCode}"));
}
[ContextMenu("Text Get Scene")]
public void GetScene()
{
GetAuthorizedScene(sceneName, (data) =>
{
JObject parsed = JObject.Parse(data);
foreach (var prop in parsed.Properties())
{
testResult = prop.Value.ToString();
}
}, (errorCode) => Debug.Log(errorCode));
}
public UnityWebRequest CustomPostAuthRequest(string apiKey, string data)
{
var request = new UnityWebRequest(authStatus.httpOrigin + apiKey, "POST");
byte[] bodyRaw = Encoding.UTF8.GetBytes(data.ToString());
request.uploadHandler = (UploadHandler)new UploadHandlerRaw(bodyRaw);
request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
request.SetRequestHeader("Content-Type", @"application/json");
request.SetRequestHeader("Authorization", $"bearer {authStatus.accessToken}");
activeRequest = request;
return request;
}
public UnityWebRequest CustomGetAuth(string apiKey)
{
var request = new UnityWebRequest(authStatus.httpOrigin + apiKey, "GET");
request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
request.SetRequestHeader("Accept", $"application/json");
request.SetRequestHeader("Content-Type", @"application/json");
request.SetRequestHeader("Authorization", $"bearer {authStatus.accessToken}");
activeRequest = request;
return request;
}
public void Logout()
{
authStatus = new AuthStatus();
}
private void OnDisable()
{
StopAllCoroutines();
}
private void OnDestroy()
{
if (activeRequest != null)
{
activeRequest.Abort();
activeRequest.Dispose();
activeRequest = null;
}
}
}
#region Models
[Serializable]
public class AuthStatus
{
public string accessToken = string.Empty;
public string refreshToken = string.Empty;
public int expiresIn;
public long accessTokenExpirationTime;
public UserAuthStatus user;
public string saveID = string.Empty;
public string httpOrigin = string.Empty;
public string saveApiOverride = string.Empty;
[Serializable]
public class UserAuthStatus
{
public string email;
}
}
[Serializable]
public class TokenRefreshModel
{
public string accessToken = string.Empty;
public int expiresIn;
public string refreshToken = string.Empty;
}
#endregion
}
Editor is loading...
Leave a Comment