diff --git a/Moonlight.ApiServer/Http/Controllers/OAuth2/OAuth2Controller.cs b/Moonlight.ApiServer/Http/Controllers/OAuth2/OAuth2Controller.cs
index cafbcb03..dcb99546 100644
--- a/Moonlight.ApiServer/Http/Controllers/OAuth2/OAuth2Controller.cs
+++ b/Moonlight.ApiServer/Http/Controllers/OAuth2/OAuth2Controller.cs
@@ -1,18 +1,19 @@
+using Microsoft.AspNetCore.Components;
+using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.Mvc;
using MoonCore.Exceptions;
using MoonCore.Extended.Abstractions;
using MoonCore.Extended.OAuth2.AuthServer;
using MoonCore.Extended.OAuth2.Models;
-using MoonCore.Services;
-using Moonlight.ApiServer.Configuration;
using Moonlight.ApiServer.Database.Entities;
+using Moonlight.ApiServer.Http.Controllers.OAuth2.Pages;
using Moonlight.ApiServer.Services;
using Moonlight.Shared.Http.Responses.OAuth2;
namespace Moonlight.ApiServer.Http.Controllers.OAuth2;
[ApiController]
-[Route("oauth2")]
+[Microsoft.AspNetCore.Mvc.Route("oauth2")]
public class OAuth2Controller : Controller
{
private readonly OAuth2Service OAuth2Service;
@@ -31,7 +32,8 @@ public class OAuth2Controller : Controller
public async Task Authorize(
[FromQuery(Name = "response_type")] string responseType,
[FromQuery(Name = "client_id")] string clientId,
- [FromQuery(Name = "redirect_uri")] string redirectUri
+ [FromQuery(Name = "redirect_uri")] string redirectUri,
+ [FromQuery(Name = "action")] string action = "login"
)
{
if (responseType != "code")
@@ -41,20 +43,29 @@ public class OAuth2Controller : Controller
throw new HttpApiException("Invalid authorization request", 400);
Response.StatusCode = 200;
- await Response.WriteAsync(
- "
Login lol
" +
- "
" +
- "
" +
- ""
- );
+
+ if (action == "register")
+ {
+ await Response.WriteAsync(
+ await RenderPage(parmeters =>
+ {
+ parmeters.Add("ClientId", clientId);
+ parmeters.Add("ResponseType", responseType);
+ parmeters.Add("RedirectUri", redirectUri);
+ })
+ );
+ }
+ else
+ {
+ await Response.WriteAsync(
+ await RenderPage(parmeters =>
+ {
+ parmeters.Add("ClientId", clientId);
+ parmeters.Add("ResponseType", responseType);
+ parmeters.Add("RedirectUri", redirectUri);
+ })
+ );
+ }
}
[HttpPost("authorize")]
@@ -189,4 +200,22 @@ public class OAuth2Controller : Controller
Email = currentUser.Email
};
}
+
+ private async Task RenderPage(Action>? onConfigureParameters = null) where T : ComponentBase
+ {
+ var parameters = new Dictionary();
+ onConfigureParameters?.Invoke(parameters);
+
+ await using var htmlRenderer = new HtmlRenderer(HttpContext.RequestServices, HttpContext.RequestServices.GetRequiredService());
+
+ var html = await htmlRenderer.Dispatcher.InvokeAsync(async () =>
+ {
+ var parameterView = ParameterView.FromDictionary(parameters!);
+ var output = await htmlRenderer.RenderComponentAsync(parameterView);
+
+ return output.ToHtmlString();
+ });
+
+ return html;
+ }
}
\ No newline at end of file
diff --git a/Moonlight.ApiServer/Http/Controllers/OAuth2/Pages/Login.razor b/Moonlight.ApiServer/Http/Controllers/OAuth2/Pages/Login.razor
new file mode 100644
index 00000000..ce39a655
--- /dev/null
+++ b/Moonlight.ApiServer/Http/Controllers/OAuth2/Pages/Login.razor
@@ -0,0 +1,66 @@
+
+
+ Login to your moonlight account
+
+
+
+
+
+
+
+
+

+
Sign in to your account
+
+
+
+
+
+
+ Not a member?
+
+ @{
+ var registerUrl = $"?response_type={ResponseType}&client_id={ClientId}&redirect_uri={RedirectUri}&action=register";
+ }
+
+ Register now
+
+
+
+
+
+
+@code
+{
+ [Parameter]
+ public string ClientId { get; set; }
+
+ [Parameter]
+ public string RedirectUri { get; set; }
+
+ [Parameter]
+ public string ResponseType { get; set; }
+}
diff --git a/Moonlight.ApiServer/Http/Controllers/OAuth2/Pages/Register.razor b/Moonlight.ApiServer/Http/Controllers/OAuth2/Pages/Register.razor
new file mode 100644
index 00000000..ca8a9ba0
--- /dev/null
+++ b/Moonlight.ApiServer/Http/Controllers/OAuth2/Pages/Register.razor
@@ -0,0 +1,74 @@
+
+
+ Register your moonlight account
+
+
+
+
+
+
+
+
+

+
Create your account
+
+
+
+
+
+
+ Already a member?
+
+ @{
+ var loginUrl = $"?response_type={ResponseType}&client_id={ClientId}&redirect_uri={RedirectUri}&action=login";
+ }
+
+ Login now
+
+
+
+
+
+
+@code
+{
+ [Parameter]
+ public string ClientId { get; set; }
+
+ [Parameter]
+ public string RedirectUri { get; set; }
+
+ [Parameter]
+ public string ResponseType { get; set; }
+}
diff --git a/Moonlight.Client/UI/Screens/AuthenticationScreen.razor b/Moonlight.Client/UI/Screens/AuthenticationScreen.razor
index 62ae78ff..8e302685 100644
--- a/Moonlight.Client/UI/Screens/AuthenticationScreen.razor
+++ b/Moonlight.Client/UI/Screens/AuthenticationScreen.razor
@@ -108,6 +108,8 @@ else
{
IsHandlingDone = true;
await InvokeAsync(StateHasChanged);
+
+ Navigation.NavigateTo("/", true);
}
}
@@ -120,6 +122,9 @@ else
$"&redirect_uri={authStartData.RedirectUri}" +
$"&response_type=code";
+ Navigation.NavigateTo(uri, true);
+ return;
+
try
{
await WindowService.Open(