From 0a61586e39ab9a574be1e1befd28a104541e0ffe Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Tue, 21 Jan 2025 17:13:53 +0100 Subject: [PATCH] =?UTF-8?q?refactor(ConsumerApi):=20umbenannt=20in=20Consu?= =?UTF-8?q?mer=20mit=20LoginDto.=20=20-=20ConsumerApi.Name=20umbenannt=20i?= =?UTF-8?q?n=20Id=20=20-=20Eigenschaft=20audience=20hinzugef=C3=BCgt.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/AuthController.cs | 20 +++++++++---------- .../Dto/ConsumerApiLogin.cs | 4 ---- src/DigitalData.Auth.API/Dto/ConsumerLogin.cs | 4 ++++ src/DigitalData.Auth.API/Entities/Consumer.cs | 4 ++++ .../Entities/ConsumerApi.cs | 4 ---- src/DigitalData.Auth.API/Program.cs | 6 +++--- .../Services/ConfiguredConsumerApiService.cs | 19 ------------------ .../Services/ConfiguredConsumerService.cs | 19 ++++++++++++++++++ .../Services/Contracts/IConsumerApiService.cs | 11 ---------- .../Services/Contracts/IConsumerService.cs | 11 ++++++++++ .../Services/DIExtensions.cs | 6 +++--- .../consumer-repository.json | 19 ++++++++++++++++++ src/DigitalData.Auth.API/consumers-api.json | 12 ----------- 13 files changed, 73 insertions(+), 66 deletions(-) delete mode 100644 src/DigitalData.Auth.API/Dto/ConsumerApiLogin.cs create mode 100644 src/DigitalData.Auth.API/Dto/ConsumerLogin.cs create mode 100644 src/DigitalData.Auth.API/Entities/Consumer.cs delete mode 100644 src/DigitalData.Auth.API/Entities/ConsumerApi.cs delete mode 100644 src/DigitalData.Auth.API/Services/ConfiguredConsumerApiService.cs create mode 100644 src/DigitalData.Auth.API/Services/ConfiguredConsumerService.cs delete mode 100644 src/DigitalData.Auth.API/Services/Contracts/IConsumerApiService.cs create mode 100644 src/DigitalData.Auth.API/Services/Contracts/IConsumerService.cs create mode 100644 src/DigitalData.Auth.API/consumer-repository.json delete mode 100644 src/DigitalData.Auth.API/consumers-api.json diff --git a/src/DigitalData.Auth.API/Controllers/AuthController.cs b/src/DigitalData.Auth.API/Controllers/AuthController.cs index cff58d0..d15646b 100644 --- a/src/DigitalData.Auth.API/Controllers/AuthController.cs +++ b/src/DigitalData.Auth.API/Controllers/AuthController.cs @@ -19,7 +19,7 @@ namespace DigitalData.Auth.API.Controllers { private readonly IJwtSignatureHandler _userSignatureHandler; - private readonly IJwtSignatureHandler _apiSignatureHandler; + private readonly IJwtSignatureHandler _consumerSignatureHandler; private readonly AuthApiParams _apiParams; @@ -31,9 +31,9 @@ namespace DigitalData.Auth.API.Controllers private readonly IDirectorySearchService _dirSearchService; - private readonly IConsumerApiService _consumerApiService; + private readonly IConsumerService _consumerService; - public AuthController(IJwtSignatureHandler userSignatureHandler, IOptions cookieParamsOptions, ICryptoFactory cryptoFactory, ILogger logger, IUserService userService, IDirectorySearchService dirSearchService, IConsumerApiService consumerApiService, IJwtSignatureHandler apiSignatureHandler) + public AuthController(IJwtSignatureHandler userSignatureHandler, IOptions cookieParamsOptions, ICryptoFactory cryptoFactory, ILogger logger, IUserService userService, IDirectorySearchService dirSearchService, IConsumerService consumerService, IJwtSignatureHandler apiSignatureHandler) { _apiParams = cookieParamsOptions.Value; _userSignatureHandler = userSignatureHandler; @@ -41,8 +41,8 @@ namespace DigitalData.Auth.API.Controllers _logger = logger; _userService = userService; _dirSearchService = dirSearchService; - _consumerApiService = consumerApiService; - _apiSignatureHandler = apiSignatureHandler; + _consumerService = consumerService; + _consumerSignatureHandler = apiSignatureHandler; } private async Task CreateTokenAsync(LogInDto login, string consumerRoute, bool cookie = true) @@ -72,9 +72,9 @@ namespace DigitalData.Auth.API.Controllers return Ok(token); } - private async Task CreateTokenAsync(ConsumerApiLogin login, bool cookie = true) + private async Task CreateTokenAsync(ConsumerLogin login, bool cookie = true) { - var api = await _consumerApiService.ReadByNameAsync(login.Name); + var api = await _consumerService.ReadByIdAsync(login.Id); if (api is null || api.Password != login.Password) return Unauthorized(); @@ -82,7 +82,7 @@ namespace DigitalData.Auth.API.Controllers if (!_cryptoFactory.TokenDescriptors.TryGet(_apiParams.Issuer, _apiParams.DefaultConsumer.Audience, out var descriptor)) return StatusCode(StatusCodes.Status500InternalServerError); - var token = _apiSignatureHandler.WriteToken(api, descriptor); + var token = _consumerSignatureHandler.WriteToken(api, descriptor); //set cookie if (cookie) @@ -112,7 +112,7 @@ namespace DigitalData.Auth.API.Controllers [HttpPost("login")] [AllowAnonymous] - public async Task Login([FromForm] ConsumerApiLogin login) + public async Task Login([FromForm] ConsumerLogin login) { try { @@ -155,7 +155,7 @@ namespace DigitalData.Auth.API.Controllers } [HttpPost] - public async Task CreateTokenViaBody([FromBody] ConsumerApiLogin login, [FromQuery] bool cookie = false) + public async Task CreateTokenViaBody([FromBody] ConsumerLogin login, [FromQuery] bool cookie = false) { try { diff --git a/src/DigitalData.Auth.API/Dto/ConsumerApiLogin.cs b/src/DigitalData.Auth.API/Dto/ConsumerApiLogin.cs deleted file mode 100644 index 72c667e..0000000 --- a/src/DigitalData.Auth.API/Dto/ConsumerApiLogin.cs +++ /dev/null @@ -1,4 +0,0 @@ -namespace DigitalData.Auth.API.Dto -{ - public record ConsumerApiLogin(string Name, string Password); -} \ No newline at end of file diff --git a/src/DigitalData.Auth.API/Dto/ConsumerLogin.cs b/src/DigitalData.Auth.API/Dto/ConsumerLogin.cs new file mode 100644 index 0000000..03b4cd7 --- /dev/null +++ b/src/DigitalData.Auth.API/Dto/ConsumerLogin.cs @@ -0,0 +1,4 @@ +namespace DigitalData.Auth.API.Dto +{ + public record ConsumerLogin(string Id, string Password); +} \ No newline at end of file diff --git a/src/DigitalData.Auth.API/Entities/Consumer.cs b/src/DigitalData.Auth.API/Entities/Consumer.cs new file mode 100644 index 0000000..68239c1 --- /dev/null +++ b/src/DigitalData.Auth.API/Entities/Consumer.cs @@ -0,0 +1,4 @@ +namespace DigitalData.Auth.API.Entities +{ + public record Consumer(string Id, string Password, string Audience); +} \ No newline at end of file diff --git a/src/DigitalData.Auth.API/Entities/ConsumerApi.cs b/src/DigitalData.Auth.API/Entities/ConsumerApi.cs deleted file mode 100644 index 0c3d5a4..0000000 --- a/src/DigitalData.Auth.API/Entities/ConsumerApi.cs +++ /dev/null @@ -1,4 +0,0 @@ -namespace DigitalData.Auth.API.Entities -{ - public record ConsumerApi(string Name, string Password); -} \ No newline at end of file diff --git a/src/DigitalData.Auth.API/Program.cs b/src/DigitalData.Auth.API/Program.cs index 5ff2882..9224ef6 100644 --- a/src/DigitalData.Auth.API/Program.cs +++ b/src/DigitalData.Auth.API/Program.cs @@ -13,7 +13,7 @@ using Microsoft.OpenApi.Models; var builder = WebApplication.CreateBuilder(args); -builder.Configuration.AddJsonFile("consumers-api.json", true, true); +builder.Configuration.AddJsonFile("consumer-repository.json", true, true); var config = builder.Configuration; @@ -23,9 +23,9 @@ var apiParams = config.Get() ?? throw new InvalidOperationExcepti builder.Services.Configure(config); builder.Services.AddConsumerApiService(config); builder.Services.AddCryptoFactory(config.GetSection("CryptParams")); -builder.Services.AddJwtSignatureHandler(api => new Dictionary +builder.Services.AddJwtSignatureHandler(api => new Dictionary { - { JwtRegisteredClaimNames.Sub, api.Name }, + { JwtRegisteredClaimNames.Sub, api.Id }, { JwtRegisteredClaimNames.Iat, DateTimeOffset.UtcNow.ToUnixTimeSeconds() } }); builder.Services.AddJwtSignatureHandler(user => new Dictionary diff --git a/src/DigitalData.Auth.API/Services/ConfiguredConsumerApiService.cs b/src/DigitalData.Auth.API/Services/ConfiguredConsumerApiService.cs deleted file mode 100644 index c250049..0000000 --- a/src/DigitalData.Auth.API/Services/ConfiguredConsumerApiService.cs +++ /dev/null @@ -1,19 +0,0 @@ -using DigitalData.Auth.API.Entities; -using DigitalData.Auth.API.Services.Contracts; -using Microsoft.Extensions.Options; - -namespace DigitalData.Auth.API.Services -{ - public class ConfiguredConsumerApiService : IConsumerApiService - { - private readonly IEnumerable _consumerAPIs; - public ConfiguredConsumerApiService(IOptions> options) - { - _consumerAPIs = options.Value; - } - - public Task ReadByNameAsync(string name) => Task.Run(() => _consumerAPIs.FirstOrDefault(api => api.Name == name)); - - public async Task VerifyAsync(string name, string password) => (await ReadByNameAsync(name))?.Password == password; - } -} \ No newline at end of file diff --git a/src/DigitalData.Auth.API/Services/ConfiguredConsumerService.cs b/src/DigitalData.Auth.API/Services/ConfiguredConsumerService.cs new file mode 100644 index 0000000..4eedea5 --- /dev/null +++ b/src/DigitalData.Auth.API/Services/ConfiguredConsumerService.cs @@ -0,0 +1,19 @@ +using DigitalData.Auth.API.Entities; +using DigitalData.Auth.API.Services.Contracts; +using Microsoft.Extensions.Options; + +namespace DigitalData.Auth.API.Services +{ + public class ConfiguredConsumerService : IConsumerService + { + private readonly IEnumerable _consumerAPIs; + public ConfiguredConsumerService(IOptions> options) + { + _consumerAPIs = options.Value; + } + + public Task ReadByIdAsync(string id) => Task.Run(() => _consumerAPIs.FirstOrDefault(api => api.Id == id)); + + public async Task VerifyAsync(string id, string password) => (await ReadByIdAsync(id))?.Password == password; + } +} \ No newline at end of file diff --git a/src/DigitalData.Auth.API/Services/Contracts/IConsumerApiService.cs b/src/DigitalData.Auth.API/Services/Contracts/IConsumerApiService.cs deleted file mode 100644 index 32896e8..0000000 --- a/src/DigitalData.Auth.API/Services/Contracts/IConsumerApiService.cs +++ /dev/null @@ -1,11 +0,0 @@ -using DigitalData.Auth.API.Entities; - -namespace DigitalData.Auth.API.Services.Contracts -{ - public interface IConsumerApiService - { - public Task ReadByNameAsync(string name); - - public Task VerifyAsync(string name, string password); - } -} \ No newline at end of file diff --git a/src/DigitalData.Auth.API/Services/Contracts/IConsumerService.cs b/src/DigitalData.Auth.API/Services/Contracts/IConsumerService.cs new file mode 100644 index 0000000..5a3bad4 --- /dev/null +++ b/src/DigitalData.Auth.API/Services/Contracts/IConsumerService.cs @@ -0,0 +1,11 @@ +using DigitalData.Auth.API.Entities; + +namespace DigitalData.Auth.API.Services.Contracts +{ + public interface IConsumerService + { + public Task ReadByIdAsync(string id); + + public Task VerifyAsync(string id, string password); + } +} \ No newline at end of file diff --git a/src/DigitalData.Auth.API/Services/DIExtensions.cs b/src/DigitalData.Auth.API/Services/DIExtensions.cs index 395915b..c85a715 100644 --- a/src/DigitalData.Auth.API/Services/DIExtensions.cs +++ b/src/DigitalData.Auth.API/Services/DIExtensions.cs @@ -8,9 +8,9 @@ namespace DigitalData.Auth.API.Services { public static IServiceCollection AddConsumerApiService(this IServiceCollection services, IConfiguration configuration, string key = "ConsumerAPIs") { - var consumerApis = configuration.GetSection(key).Get>() ?? throw new InvalidOperationException($"No Consumer list found in {key} in configuration."); - services.AddSingleton(Options.Create(consumerApis)); - services.AddSingleton(); + var consumers = configuration.GetSection(key).Get>() ?? throw new InvalidOperationException($"No Consumer list found in {key} in configuration."); + services.AddSingleton(Options.Create(consumers)); + services.AddSingleton(); return services; } } diff --git a/src/DigitalData.Auth.API/consumer-repository.json b/src/DigitalData.Auth.API/consumer-repository.json new file mode 100644 index 0000000..db6c921 --- /dev/null +++ b/src/DigitalData.Auth.API/consumer-repository.json @@ -0,0 +1,19 @@ +{ + "ConsumerAPIs": [ + { + "Id": "auth", + "Audience": "auth.digitaldata.works", + "Password": "aQ9z!2@TgY7b#fHcD3pLmV1$wX" + }, + { + "Id": "work-flow", + "Audience": "work-flow.digitaldata.works", + "Password": "t3B|aiJ'i-snLzNRj3B{9=&:lM5P@'iL" + }, + { + "Id": "user-manager", + "Audience": "user-manager.digitaldata.works", + "Password": "a098Hvu1-y29ep{KPQO]#>8TK+fk{O`_d" + } + ] +} \ No newline at end of file diff --git a/src/DigitalData.Auth.API/consumers-api.json b/src/DigitalData.Auth.API/consumers-api.json deleted file mode 100644 index 7f8065e..0000000 --- a/src/DigitalData.Auth.API/consumers-api.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "ConsumerAPIs": [ - { - "Name": "WorkFlow.API", - "Password": "t3B|aiJ'i-snLzNRj3B{9=&:lM5P@'iL" - }, - { - "Name": "DigitalData.UserManager.API", - "Password": "a098Hvu1-y29ep{KPQO]#>8TK+fk{O`_d" - } - ] -} \ No newline at end of file