diff --git a/src/Zirconium/Core/AuthManager.cs b/src/Zirconium/Core/AuthManager.cs index 3239d09..3b9098b 100644 --- a/src/Zirconium/Core/AuthManager.cs +++ b/src/Zirconium/Core/AuthManager.cs @@ -1,8 +1,10 @@ +using System.Collections.Generic; using System; using JWT.Algorithms; using JWT.Builder; using Newtonsoft.Json; using Zirconium.Utils; +using Zirconium.Core.Plugins.Interfaces; namespace Zirconium.Core { @@ -11,10 +13,14 @@ namespace Zirconium.Core private App _app; private string _secretString; private const long DEFAULT_TOKEN_EXPIRATION_TIME_HOURS = 24 * 3600000; + private IList _authProviders; + private IAuthProvider _defaultAuthProvider; public AuthManager(App app) { _app = app; + _authProviders = new List(); + _defaultAuthProvider = null; _secretString = Guid.NewGuid().ToString(); } @@ -42,7 +48,18 @@ namespace Zirconium.Core .WithSecret(_secretString) .MustVerifySignature() .Decode(token); - return JsonConvert.DeserializeObject(jsonPayload); + var payload = JsonConvert.DeserializeObject(jsonPayload); + if (_defaultAuthProvider == null) { + throw new Exception("Default auth provider isn't specified"); + } + var validToken = _defaultAuthProvider.TestToken(token, payload); + if (!validToken) + return null; + return payload; + } + + public void AddAuthProvider(IAuthProvider provider) { + _authProviders.Add(provider); } } } \ No newline at end of file diff --git a/src/Zirconium/Core/Config.cs b/src/Zirconium/Core/Config.cs index 2d1c801..1db36d1 100644 --- a/src/Zirconium/Core/Config.cs +++ b/src/Zirconium/Core/Config.cs @@ -21,6 +21,8 @@ namespace Zirconium.Core // Configurations of plugins public Dictionary Plugins { get; set; } + + public string AuthenticationProvider { get; set; } } public class Websocket diff --git a/src/Zirconium/Core/Plugins/Interfaces/IAuthProvider.cs b/src/Zirconium/Core/Plugins/Interfaces/IAuthProvider.cs new file mode 100644 index 0000000..f8de0e8 --- /dev/null +++ b/src/Zirconium/Core/Plugins/Interfaces/IAuthProvider.cs @@ -0,0 +1,8 @@ +namespace Zirconium.Core.Plugins.Interfaces +{ + public interface IAuthProvider + { + bool TestToken(string token, JWTPayload payload); + string GetAuthProviderName(); + } +} \ No newline at end of file diff --git a/src/Zirconium/Core/Plugins/Interfaces/IPluginHostAPI.cs b/src/Zirconium/Core/Plugins/Interfaces/IPluginHostAPI.cs index d99402f..dbe684e 100644 --- a/src/Zirconium/Core/Plugins/Interfaces/IPluginHostAPI.cs +++ b/src/Zirconium/Core/Plugins/Interfaces/IPluginHostAPI.cs @@ -15,5 +15,6 @@ namespace Zirconium.Core.Plugins.Interfaces void SendMessage(ConnectionInfo connInfo, BaseMessage message); dynamic GetSettings(IPluginAPI plugin); dynamic GetSettings(string pluginName); + void ProvideAuth(IAuthProvider provider); } } \ No newline at end of file diff --git a/src/Zirconium/Core/Plugins/PluginHostAPI.cs b/src/Zirconium/Core/Plugins/PluginHostAPI.cs index 4d26ea2..c66b428 100644 --- a/src/Zirconium/Core/Plugins/PluginHostAPI.cs +++ b/src/Zirconium/Core/Plugins/PluginHostAPI.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System; using Newtonsoft.Json; using Zirconium.Core.Models; using Zirconium.Core.Plugins.Interfaces; @@ -17,6 +16,10 @@ namespace Zirconium.Core.Plugins _app = app; } + public void ProvideAuth(IAuthProvider provider) { + _app.AuthManager.AddAuthProvider(provider); + } + public void FireEvent(CoreEvent coreEvent) { _router.RouteCoreEvent(coreEvent); diff --git a/src/Zirconium/Core/Plugins/PluginManager.cs b/src/Zirconium/Core/Plugins/PluginManager.cs index 89f9c07..903a85c 100644 --- a/src/Zirconium/Core/Plugins/PluginManager.cs +++ b/src/Zirconium/Core/Plugins/PluginManager.cs @@ -62,13 +62,14 @@ namespace Zirconium.Core.Plugins loader = PluginLoader.CreateFromAssemblyFile( pluginDll, sharedTypes: new[] { - typeof(IPluginAPI), - typeof(IPluginHostAPI), - typeof(IPluginManager), - typeof(IC2SMessageHandler), - typeof(ICoreEventHandler), - typeof(BaseMessage), - typeof(CoreEvent) + typeof(IPluginAPI), + typeof(IPluginHostAPI), + typeof(IPluginManager), + typeof(IAuthProvider), + typeof(IC2SMessageHandler), + typeof(ICoreEventHandler), + typeof(BaseMessage), + typeof(CoreEvent) } ); }