From 399fbbaab51b45c225acbb5bb67dd2ff69cda733 Mon Sep 17 00:00:00 2001 From: Masu-Baumgartner <68913099+Masu-Baumgartner@users.noreply.github.com> Date: Mon, 4 Nov 2024 16:34:29 +0100 Subject: [PATCH] Started testing a dx friendlier oauth2 handler --- .../UI/Components/OAuth2Handler.razor | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 Moonlight.Client/UI/Components/OAuth2Handler.razor diff --git a/Moonlight.Client/UI/Components/OAuth2Handler.razor b/Moonlight.Client/UI/Components/OAuth2Handler.razor new file mode 100644 index 00000000..48a5881e --- /dev/null +++ b/Moonlight.Client/UI/Components/OAuth2Handler.razor @@ -0,0 +1,103 @@ +@using Microsoft.AspNetCore.WebUtilities + +@inject NavigationManager Navigation + +@if (IsAuthenticated) +{ + @AuthenticatedView +} +else if (IsCodeRequest) +{ + @PostAuthView +} +else +{ + if (IsAuthStateChecking) + { + if (Loader != null) + { + @Loader + } + } + else + { + @PreAuthView + } +} + +@code +{ + [Parameter] public RenderFragment PreAuthView { get; set; } + [Parameter] public RenderFragment PostAuthView { get; set; } + [Parameter] public RenderFragment AuthenticatedView { get; set; } + [Parameter] public RenderFragment? Loader { get; set; } + + [Parameter] public Func> GetAuthState { get; set; } + [Parameter] public Func> GetLoginUrl { get; set; } + [Parameter] public Func> HandleCode { get; set; } + + private bool IsAuthStateChecking = true; + private bool IsCodeRequest = false; + private bool IsAuthenticated = false; + + private string Code; + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (!firstRender) + return; + + await Load(); + } + + private async Task Load() + { + IsAuthenticated = false; + IsAuthStateChecking = true; + + IsCodeRequest = HandleQueryCode(); + await InvokeAsync(StateHasChanged); + + if (IsCodeRequest) + { + var codeCorrect = await HandleCode.Invoke(Code); + + if (codeCorrect) + { + IsAuthenticated = true; + await InvokeAsync(StateHasChanged); + return; + } + } + + IsAuthenticated = await GetAuthState.Invoke(); + IsAuthStateChecking = false; + await InvokeAsync(StateHasChanged); + + var url = await GetLoginUrl.Invoke(); + Navigation.NavigateTo(url, true); + } + + public async Task Reload() + => await Load(); + + private bool HandleQueryCode() + { + var uri = new Uri(Navigation.Uri); + var query = QueryHelpers.ParseQuery(uri.Query); + + if (!query.TryGetValue("code", out var codeValues)) + return false; + + if (codeValues.Count == 0) + return false; + + var code = codeValues.First(); + + if (string.IsNullOrEmpty(code)) + return false; + + Code = code; + return true; + } +} \ No newline at end of file