From f2ac807486a00db4ba8486133d567e392f0fe98a Mon Sep 17 00:00:00 2001 From: vnugent Date: Sat, 9 Mar 2024 16:28:52 -0500 Subject: fix: #1 logout redirection updated to support social methods --- .../src/Auth0Portal.cs | 16 ++------- .../src/Endpoints/LogoutEndpoint.cs | 40 +++++++++++++++------- 2 files changed, 30 insertions(+), 26 deletions(-) (limited to 'plugins/providers/VNLib.Plugins.Essentials.Auth.Auth0') diff --git a/plugins/providers/VNLib.Plugins.Essentials.Auth.Auth0/src/Auth0Portal.cs b/plugins/providers/VNLib.Plugins.Essentials.Auth.Auth0/src/Auth0Portal.cs index 0ae92f4..2fcc477 100644 --- a/plugins/providers/VNLib.Plugins.Essentials.Auth.Auth0/src/Auth0Portal.cs +++ b/plugins/providers/VNLib.Plugins.Essentials.Auth.Auth0/src/Auth0Portal.cs @@ -22,8 +22,6 @@ * along with this program. If not, see https://www.gnu.org/licenses/. */ -using System; - using VNLib.Plugins.Extensions.Loading; using VNLib.Plugins.Extensions.Loading.Routing; using VNLib.Plugins.Essentials.Auth.Social; @@ -35,24 +33,16 @@ namespace VNLib.Plugins.Essentials.Auth.Auth0 [ServiceExport] [ConfigurationName(ConfigKey)] - public sealed class Auth0Portal : IOAuthProvider + public sealed class Auth0Portal(PluginBase plugin) : IOAuthProvider { internal const string ConfigKey = "auth0"; - private readonly LoginEndpoint _loginEndpoint; - private readonly LogoutEndpoint _logoutEndpoint; - - public Auth0Portal(PluginBase plugin, IConfigScope config) - { - //Init the login endpoint - _loginEndpoint = plugin.Route(); - _logoutEndpoint = plugin.Route(); - } + private readonly LoginEndpoint _loginEndpoint = plugin.Route(); + private readonly LogoutEndpoint _logoutEndpoint = plugin.Route(); /// public SocialOAuthPortal[] GetPortals() { - //Return the Auth0 portal return [ new SocialOAuthPortal( diff --git a/plugins/providers/VNLib.Plugins.Essentials.Auth.Auth0/src/Endpoints/LogoutEndpoint.cs b/plugins/providers/VNLib.Plugins.Essentials.Auth.Auth0/src/Endpoints/LogoutEndpoint.cs index 497357a..5a92968 100644 --- a/plugins/providers/VNLib.Plugins.Essentials.Auth.Auth0/src/Endpoints/LogoutEndpoint.cs +++ b/plugins/providers/VNLib.Plugins.Essentials.Auth.Auth0/src/Endpoints/LogoutEndpoint.cs @@ -22,12 +22,14 @@ * along with this program. If not, see https://www.gnu.org/licenses/. */ -using VNLib.Utils; +using System.Net; +using System.Text.Json; +using System.Text.Json.Serialization; +using VNLib.Utils.IO; using VNLib.Plugins.Extensions.Loading; using VNLib.Plugins.Essentials.Accounts; using VNLib.Plugins.Essentials.Endpoints; -using VNLib.Plugins.Essentials.Extensions; namespace VNLib.Plugins.Essentials.Auth.Auth0.Endpoints @@ -35,7 +37,7 @@ namespace VNLib.Plugins.Essentials.Auth.Auth0.Endpoints [ConfigurationName(Auth0Portal.ConfigKey)] internal sealed class LogoutEndpoint : ProtectedWebEndpoint { - private readonly IAsyncLazy ReturnUrl; + private readonly IAsyncLazy ReturnUrl; public LogoutEndpoint(PluginBase plugin, IConfigScope config) { @@ -48,23 +50,35 @@ namespace VNLib.Plugins.Essentials.Auth.Auth0.Endpoints //Build the return url once the client id is available ReturnUrl = plugin.GetSecretAsync("auth0_client_id").ToLazy(sr => { - return $"{logoutUrl}?client_id={sr.Result.ToString()}&returnTo={returnToUrl}"; - }); - } + //The result we will send to users on logout so then can properly redirect their clients + LogoutResult json = new() + { + Url = $"{logoutUrl}?client_id={sr.Result.ToString()}&returnTo={returnToUrl}" + }; - protected override ERRNO PreProccess(HttpEntity entity) - { - //Client required to be fully authorized - return base.PreProccess(entity) - && entity.IsClientAuthorized(AuthorzationCheckLevel.Critical); + VnMemoryStream vms = new(); + JsonSerializer.Serialize(vms, json); + return VnMemoryStream.CreateReadonly(vms); + }); } protected override VfReturnType Post(HttpEntity entity) { //Invalidate the login before redirecting the client entity.InvalidateLogin(); - entity.Redirect(RedirectType.Temporary, ReturnUrl.Value); - return VfReturnType.VirtualSkip; + + return VirtualClose( + entity, + HttpStatusCode.OK, + Net.Http.ContentType.Json, + ReturnUrl.Value.GetReadonlyShallowCopy() //Return stream shallow copy to avoid alloc and copy + ); + } + + sealed class LogoutResult + { + [JsonPropertyName("url")] + public string? Url { get; set; } } } } \ No newline at end of file -- cgit