Started testing a dx friendlier oauth2 handler
This commit is contained in:
103
Moonlight.Client/UI/Components/OAuth2Handler.razor
Normal file
103
Moonlight.Client/UI/Components/OAuth2Handler.razor
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user