@page "/auth" @using MoonCore.Helpers @using Moonlight.Client.Services @using Moonlight.Shared.Http.Requests.Auth @using Moonlight.Shared.Http.Responses.Auth @inject NavigationManager Navigation @inject HttpApiClient HttpApiClient @inject CookieService CookieService @inject WindowService WindowService @inject HttpClient HttpClient @if (Code == null) {
@if (IsAuthenticating) {

Login flow started in new window/tab

} else {
Moonlight

Login to access your account

Proceed to login
}
} else {
@if (IsHandlingDone) {
Moonlight

Login to access your account

Login successful. You can close this window now

} else {
}
} @code { [SupplyParameterFromQuery(Name = "code")] [Parameter] public string? Code { get; set; } private bool IsAuthenticating = false; private bool IsHandlingDone = false; protected override async Task OnAfterRenderAsync(bool firstRender) { if (!firstRender) return; if (Code == null) return; var authHandleData = await HttpApiClient.PostJson("api/auth", new OAuth2HandleRequest() { Code = Code }); await CookieService.SetValue("kms-access", authHandleData.AccessToken, 10); await CookieService.SetValue("kms-refresh", authHandleData.RefreshToken, 10); await CookieService.SetValue("kms-timestamp", DateTimeOffset.UtcNow.AddSeconds(60).ToUnixTimeSeconds().ToString(), 10); try { await WindowService.Close(); } finally { IsHandlingDone = true; await InvokeAsync(StateHasChanged); } } private async Task StartAuth(WButton _) { var authStartData = await HttpApiClient.GetJson("api/auth"); var uri = authStartData.Endpoint + $"?client_id={authStartData.ClientId}" + $"&redirect_uri={authStartData.RedirectUri}" + $"&response_type=code"; try { await WindowService.Open( uri, "OAuth2 Flow", 500, 650 ); IsAuthenticating = true; await InvokeAsync(StateHasChanged); Task.Run(async () => { while (true) { await Task.Delay(1000); try { if (HttpClient.DefaultRequestHeaders.Contains("Authorization")) HttpClient.DefaultRequestHeaders.Remove("Authorization"); HttpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + await CookieService.GetValue("kms-access", "x")); var res = await HttpClient.GetAsync("api/auth/check"); if(res.IsSuccessStatusCode) break; } finally{} } Navigation.NavigateTo(Navigation.Uri, true); }); } catch (Exception) { Navigation.NavigateTo(uri, true); } } }