diff options
author | vnugent <public@vaughnnugent.com> | 2024-03-09 16:28:52 -0500 |
---|---|---|
committer | vnugent <public@vaughnnugent.com> | 2024-03-09 16:28:52 -0500 |
commit | f2ac807486a00db4ba8486133d567e392f0fe98a (patch) | |
tree | 79ed35b19211300164f13329e1d36bbf616474c2 /plugins | |
parent | 7f3067b8fc4416d46af9b8b005a18a71770c98fe (diff) |
fix: #1 logout redirection updated to support social methods
Diffstat (limited to 'plugins')
4 files changed, 34 insertions, 46 deletions
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<LoginEndpoint>(); - _logoutEndpoint = plugin.Route<LogoutEndpoint>(); - } + private readonly LoginEndpoint _loginEndpoint = plugin.Route<LoginEndpoint>(); + private readonly LogoutEndpoint _logoutEndpoint = plugin.Route<LogoutEndpoint>(); ///<inheritdoc/> 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<string> ReturnUrl; + private readonly IAsyncLazy<VnMemoryStream> 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 diff --git a/plugins/providers/VNLib.Plugins.Essentials.Auth.Discord/src/DiscordPortal.cs b/plugins/providers/VNLib.Plugins.Essentials.Auth.Discord/src/DiscordPortal.cs index 5b0503e..ed3940f 100644 --- a/plugins/providers/VNLib.Plugins.Essentials.Auth.Discord/src/DiscordPortal.cs +++ b/plugins/providers/VNLib.Plugins.Essentials.Auth.Discord/src/DiscordPortal.cs @@ -35,22 +35,15 @@ namespace VNLib.Plugins.Essentials.Auth.Discord [ServiceExport] [ConfigurationName(ConfigKey)] - public sealed class DiscordPortal : IOAuthProvider + public sealed class DiscordPortal(PluginBase plugin) : IOAuthProvider { internal const string ConfigKey = "discord"; - private readonly DiscordOauth _loginEndpoint; - - public DiscordPortal(PluginBase plugin, IConfigScope config) - { - //Init the login endpoint - _loginEndpoint = plugin.Route<DiscordOauth>(); - } + private readonly DiscordOauth _loginEndpoint = plugin.Route<DiscordOauth>(); ///<inheritdoc/> public SocialOAuthPortal[] GetPortals() { - //Return the Discord portal return [ new SocialOAuthPortal( diff --git a/plugins/providers/VNLib.Plugins.Essentials.Auth.Github/src/GithubPortal.cs b/plugins/providers/VNLib.Plugins.Essentials.Auth.Github/src/GithubPortal.cs index 99b0ebf..946531d 100644 --- a/plugins/providers/VNLib.Plugins.Essentials.Auth.Github/src/GithubPortal.cs +++ b/plugins/providers/VNLib.Plugins.Essentials.Auth.Github/src/GithubPortal.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,22 +33,15 @@ namespace VNLib.Plugins.Essentials.Auth.Github [ServiceExport] [ConfigurationName(ConfigKey)] - public sealed class GithubPortal : IOAuthProvider + public sealed class GithubPortal(PluginBase plugin) : IOAuthProvider { internal const string ConfigKey = "github"; - private readonly GitHubOauth _loginEndpoint; - - public GithubPortal(PluginBase plugin, IConfigScope config) - { - //Init the login endpoint - _loginEndpoint = plugin.Route<GitHubOauth>(); - } + private readonly GitHubOauth _loginEndpoint = plugin.Route<GitHubOauth>(); ///<inheritdoc/> public SocialOAuthPortal[] GetPortals() { - //Return the github portal return [ new SocialOAuthPortal( |