From d673bd34945699df96e38c54f70352608430fbc4 Mon Sep 17 00:00:00 2001 From: vnugent Date: Thu, 9 Mar 2023 01:48:40 -0500 Subject: Omega cache, session, and account provider complete overhaul --- .../src/OAuth2TokenFactory.cs | 99 ++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 libs/VNLib.Plugins.Sessions.OAuth/src/OAuth2TokenFactory.cs (limited to 'libs/VNLib.Plugins.Sessions.OAuth/src/OAuth2TokenFactory.cs') diff --git a/libs/VNLib.Plugins.Sessions.OAuth/src/OAuth2TokenFactory.cs b/libs/VNLib.Plugins.Sessions.OAuth/src/OAuth2TokenFactory.cs new file mode 100644 index 0000000..b452e29 --- /dev/null +++ b/libs/VNLib.Plugins.Sessions.OAuth/src/OAuth2TokenFactory.cs @@ -0,0 +1,99 @@ +/* +* Copyright (c) 2023 Vaughn Nugent +* +* Library: VNLib +* Package: VNLib.Plugins.Essentials.Sessions.OAuth +* File: OAuth2TokenFactory.cs +* +* OAuth2TokenFactory.cs is part of VNLib.Plugins.Essentials.Sessions.OAuth which is part of the larger +* VNLib collection of libraries and utilities. +* +* VNLib.Plugins.Essentials.Sessions.OAuth is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License as +* published by the Free Software Foundation, either version 3 of the +* License, or (at your option) any later version. +* +* VNLib.Plugins.Essentials.Sessions.OAuth is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. If not, see https://www.gnu.org/licenses/. +*/ + +using System; + +using VNLib.Hashing; +using VNLib.Net.Http; +using VNLib.Plugins.Sessions.Cache.Client; +using VNLib.Plugins.Extensions.Loading; +using VNLib.Plugins.Essentials.Extensions; + + +namespace VNLib.Plugins.Sessions.OAuth +{ + [ConfigurationName(O2SessionProviderEntry.OAUTH2_CONFIG_KEY)] + internal sealed class OAuth2TokenFactory : ISessionIdFactory, IOauthSessionIdFactory + { + private readonly OAuth2SessionConfig _config; + + public OAuth2TokenFactory(PluginBase plugin, IConfigScope config) + { + //Get the oauth2 config + _config = config.DeserialzeAndValidate(); + } + + /* + * ID Regeneration is always false as OAuth2 sessions + * do not allow dynamic ID updates, they require a + * negotiation + */ + + bool ISessionIdFactory.RegenerationSupported => false; + + /* + * Connections that do not identify themselves, via a token are + * not valid. ID/Tokens must be created at once during + * authentication stage. + */ + + bool ISessionIdFactory.RegenIdOnEmptyEntry => false; + + + /// + int IOauthSessionIdFactory.MaxTokensPerApp => _config.MaxTokensPerApp; + + /// + TimeSpan IOauthSessionIdFactory.SessionValidFor => TimeSpan.FromSeconds(_config.TokenLifeTimeSeconds); + + /// + string IOauthSessionIdFactory.TokenType => "Bearer"; + + /// + bool ISessionIdFactory.CanService(IHttpEvent entity) + { + return entity.Server.HasAuthorization(out _); + } + + /// + public GetTokenResult GenerateTokensAndId() + { + //Token is the raw value + string token = RandomHash.GetRandomBase64(_config.AccessTokenSize); + + //Return sessid result + return new(token, null); + } + + string ISessionIdFactory.RegenerateId(IHttpEvent entity) + { + throw new NotSupportedException("Id regeneration is not supported for OAuth2 sessions"); + } + + string? ISessionIdFactory.TryGetSessionId(IHttpEvent entity) + { + return entity.Server.HasAuthorization(out string? token) ? token : null; + } + } +} \ No newline at end of file -- cgit