aboutsummaryrefslogtreecommitdiff
path: root/plugins/VNLib.Plugins.Essentials.SocialOauth
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/VNLib.Plugins.Essentials.SocialOauth')
-rw-r--r--plugins/VNLib.Plugins.Essentials.SocialOauth/src/Endpoints/Auth0.cs8
-rw-r--r--plugins/VNLib.Plugins.Essentials.SocialOauth/src/OauthClientConfig.cs33
-rw-r--r--plugins/VNLib.Plugins.Essentials.SocialOauth/src/SocialOauthBase.cs6
3 files changed, 22 insertions, 25 deletions
diff --git a/plugins/VNLib.Plugins.Essentials.SocialOauth/src/Endpoints/Auth0.cs b/plugins/VNLib.Plugins.Essentials.SocialOauth/src/Endpoints/Auth0.cs
index 2f99693..3166610 100644
--- a/plugins/VNLib.Plugins.Essentials.SocialOauth/src/Endpoints/Auth0.cs
+++ b/plugins/VNLib.Plugins.Essentials.SocialOauth/src/Endpoints/Auth0.cs
@@ -45,7 +45,7 @@ namespace VNLib.Plugins.Essentials.SocialOauth.Endpoints
[ConfigurationName("auth0")]
internal sealed class Auth0 : SocialOauthBase
{
- private readonly Task<ReadOnlyJsonWebKey[]> Auth0VerificationJwk;
+ private readonly IAsyncLazy<ReadOnlyJsonWebKey[]> Auth0VerificationJwk;
public Auth0(PluginBase plugin, IConfigScope config) : base(plugin, config)
{
@@ -54,7 +54,7 @@ namespace VNLib.Plugins.Essentials.SocialOauth.Endpoints
Uri keyUri = new(keyUrl);
//Get certificate on background thread
- Auth0VerificationJwk = Task.Run(() => GetRsaCertificate(keyUri));
+ Auth0VerificationJwk = Task.Run(() => GetRsaCertificate(keyUri)).AsLazy();
}
@@ -143,7 +143,7 @@ namespace VNLib.Plugins.Essentials.SocialOauth.Endpoints
using JsonWebToken jwt = JsonWebToken.Parse(clientAccess.IdToken);
//Verify the token against the first signing key
- if (!jwt.VerifyFromJwk(Auth0VerificationJwk.Result[0]))
+ if (!jwt.VerifyFromJwk(Auth0VerificationJwk.Value[0]))
{
return EmptyLoginData;
}
@@ -164,7 +164,7 @@ namespace VNLib.Plugins.Essentials.SocialOauth.Endpoints
}
//Verify audience matches client id
- if (!Config.ClientID.Equals(audience, StringComparison.Ordinal))
+ if (!Config.ClientID.Value.Equals(audience, StringComparison.Ordinal))
{
//Invalid audience
return EmptyLoginData;
diff --git a/plugins/VNLib.Plugins.Essentials.SocialOauth/src/OauthClientConfig.cs b/plugins/VNLib.Plugins.Essentials.SocialOauth/src/OauthClientConfig.cs
index b7e94a2..e7e81d6 100644
--- a/plugins/VNLib.Plugins.Essentials.SocialOauth/src/OauthClientConfig.cs
+++ b/plugins/VNLib.Plugins.Essentials.SocialOauth/src/OauthClientConfig.cs
@@ -23,7 +23,6 @@
*/
using System;
-using System.Threading.Tasks;
using System.Collections.Generic;
using VNLib.Utils.Extensions;
@@ -35,7 +34,7 @@ using VNLib.Plugins.Extensions.Loading.Users;
namespace VNLib.Plugins.Essentials.SocialOauth
{
- public sealed class OauthClientConfig : IAsyncConfigurable
+ public sealed class OauthClientConfig
{
private readonly string ConfigName;
@@ -67,27 +66,24 @@ namespace VNLib.Plugins.Essentials.SocialOauth
Users = plugin.GetOrCreateSingleton<UserManager>();
Passwords = plugin.GetOrCreateSingleton<ManagedPasswordHashing>();
- }
-
- public async Task ConfigureServiceAsync(PluginBase plugin)
- {
- //Get id/secret
- Task<SecretResult?> clientIdTask = plugin.TryGetSecretAsync($"{ConfigName}_client_id");
- Task<SecretResult?> secretTask = plugin.TryGetSecretAsync($"{ConfigName}_client_secret");
- await Task.WhenAll(secretTask, clientIdTask);
+ //Setup async lazy loaders for secrets
+ ClientID = plugin.GetSecretAsync($"{ConfigName}_client_id")
+ .ToLazy(static r => r.Result.ToString());
- using SecretResult? secret = await secretTask;
- using SecretResult? clientId = await clientIdTask;
-
- ClientID = clientId?.Result.ToString() ?? throw new KeyNotFoundException($"Missing {ConfigName} client id from config or vault");
- ClientSecret = secret?.Result.ToString() ?? throw new KeyNotFoundException($"Missing the {ConfigName} client secret from config or vault");
+ ClientSecret = plugin.GetSecretAsync($"{ConfigName}_client_secret")
+ .ToLazy(static r => r.Result.ToString());
}
-
- public string ClientID { get; private set; } = string.Empty;
+ /// <summary>
+ /// The client ID for the OAuth2 service
+ /// </summary>
+ public IAsyncLazy<string> ClientID { get; }
- public string ClientSecret { get; private set; } = string.Empty;
+ /// <summary>
+ /// The client secret for the OAuth2 service
+ /// </summary>
+ public IAsyncLazy<string> ClientSecret { get; }
/// <summary>
@@ -113,6 +109,7 @@ namespace VNLib.Plugins.Essentials.SocialOauth
public Uri UserDataUrl { get; }
public TimeSpan LoginNonceLifetime { get; }
+
/// <summary>
/// The user store to create/get users from
/// </summary>
diff --git a/plugins/VNLib.Plugins.Essentials.SocialOauth/src/SocialOauthBase.cs b/plugins/VNLib.Plugins.Essentials.SocialOauth/src/SocialOauthBase.cs
index 9d6232c..e594462 100644
--- a/plugins/VNLib.Plugins.Essentials.SocialOauth/src/SocialOauthBase.cs
+++ b/plugins/VNLib.Plugins.Essentials.SocialOauth/src/SocialOauthBase.cs
@@ -188,8 +188,8 @@ namespace VNLib.Plugins.Essentials.SocialOauth
RestRequest request = new(Config.AccessTokenUrl, Method.Post);
//Add required params url-encoded
- request.AddParameter("client_id", Config.ClientID, ParameterType.GetOrPost);
- request.AddParameter("client_secret", Config.ClientSecret, ParameterType.GetOrPost);
+ request.AddParameter("client_id", Config.ClientID.Value, ParameterType.GetOrPost);
+ request.AddParameter("client_secret", Config.ClientSecret.Value, ParameterType.GetOrPost);
request.AddParameter("grant_type", "authorization_code", ParameterType.GetOrPost);
request.AddParameter("code", code, ParameterType.GetOrPost);
request.AddParameter("redirect_uri", $"{ev.Server.RequestUri.Scheme}://{ev.Server.RequestUri.Authority}{Path}", ParameterType.GetOrPost);
@@ -653,7 +653,7 @@ namespace VNLib.Plugins.Essentials.SocialOauth
writer.Append(config.AccessCodeUrl.OriginalString);
//begin query arguments
writer.Append("&client_id=");
- writer.Append(config.ClientID);
+ writer.Append(config.ClientID.Value);
//add the redirect url
writer.Append("&redirect_uri=");
writer.Append(redirectUrl);