Started testing a dx friendlier oauth2 handler

This commit is contained in:
Masu-Baumgartner
2024-11-04 16:34:29 +01:00
parent 06f7731011
commit 399fbbaab5

View File

@@ -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<Task<bool>> GetAuthState { get; set; }
[Parameter] public Func<Task<string>> GetLoginUrl { get; set; }
[Parameter] public Func<string, Task<bool>> 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;
}
}