Files
UnrealEngine/Engine/Source/Programs/UnrealCloudDDC/Jupiter/Implementation/ServiceCredentials.cs
2025-05-18 13:04:45 +08:00

75 lines
2.2 KiB
C#

// Copyright Epic Games, Inc. All Rights Reserved.
using System;
using System.Threading.Tasks;
using Jupiter.Common.Implementation;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
namespace Jupiter.Implementation
{
public interface IServiceCredentials
{
Task<string?> GetTokenAsync();
string GetAuthenticationScheme();
}
public class ServiceCredentials : IServiceCredentials
{
private readonly ClientCredentialOAuthAuthenticator? _authenticator;
private readonly IOptionsMonitor<ServiceCredentialSettings> _settings;
private readonly ISecretResolver _secretResolver;
public ServiceCredentials(IServiceProvider provider, IOptionsMonitor<ServiceCredentialSettings> settings, ISecretResolver secretResolver)
{
_settings = settings;
_secretResolver = secretResolver;
if (settings.CurrentValue.OAuthLoginUrl != null)
{
string? clientId = secretResolver.Resolve(settings.CurrentValue.OAuthClientId);
if (string.IsNullOrEmpty(clientId))
{
throw new ArgumentException("ClientId must be set when using a service credential");
}
string? clientSecret = secretResolver.Resolve(settings.CurrentValue.OAuthClientSecret);
if (string.IsNullOrEmpty(clientSecret))
{
throw new ArgumentException("ClientSecret must be set when using a service credential");
}
_authenticator = ActivatorUtilities.CreateInstance<ClientCredentialOAuthAuthenticator>(provider, settings.CurrentValue.OAuthLoginUrl, clientId, clientSecret, settings.CurrentValue.OAuthScope);
}
}
public string? GetToken()
{
if (_authenticator == null && !string.IsNullOrEmpty(_settings.CurrentValue.AccessToken))
{
return _secretResolver.Resolve(_settings.CurrentValue.AccessToken);
}
return _authenticator?.AuthenticateAsync().Result;
}
public async Task<string?> GetTokenAsync()
{
if (_authenticator == null)
{
if (!string.IsNullOrEmpty(_settings.CurrentValue.AccessToken))
{
return _secretResolver.Resolve(_settings.CurrentValue.AccessToken);
}
return null;
}
return await _authenticator.AuthenticateAsync();
}
public string GetAuthenticationScheme()
{
return _settings.CurrentValue.SchemeName;
}
}
}