From d78515042677dd3f710fc27999c6d9c1f140f76e Mon Sep 17 00:00:00 2001 From: Kasper Juul Hermansen Date: Tue, 16 Nov 2021 22:06:33 +0100 Subject: [PATCH] Add login --- .../DependencyInjection.cs | 46 +++++++++++++++++++ .../Todo.Infrastructure.csproj | 17 +++++++ src/backend/server/Todo.sln | 6 +++ .../Todo.Api/Controllers/TodosController.cs | 4 +- .../Todo.Api/Properties/launchSettings.json | 5 +- src/backend/server/src/Todo.Api/Startup.cs | 6 +++ .../server/src/Todo.Api/Todo.Api.csproj | 1 + 7 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 src/backend/server/Todo.Infrastructure/DependencyInjection.cs create mode 100644 src/backend/server/Todo.Infrastructure/Todo.Infrastructure.csproj diff --git a/src/backend/server/Todo.Infrastructure/DependencyInjection.cs b/src/backend/server/Todo.Infrastructure/DependencyInjection.cs new file mode 100644 index 0000000..785dcd4 --- /dev/null +++ b/src/backend/server/Todo.Infrastructure/DependencyInjection.cs @@ -0,0 +1,46 @@ +using System.ComponentModel.DataAnnotations; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; + +namespace Todo.Infrastructure; + +public static class DependencyInjection +{ + public static IServiceCollection AddInfrastructure(this IServiceCollection services, IConfiguration configuration) + { + var giteaAuthOptions = new GiteaAuthOptions(); + var giteaOptions = configuration.GetRequiredSection("GITEA"); + giteaOptions.Bind(giteaAuthOptions); + + services + .AddOptions() + .Bind(giteaOptions) + .ValidateDataAnnotations(); + + return services.AddAuthentication(options => + { + options.DefaultScheme = "Cookies"; + options.DefaultChallengeScheme = "oidc"; + }) + .AddCookie("Cookies") + .AddOpenIdConnect("oidc", options => + { + options.Authority = giteaAuthOptions.Url; + options.ClientId = giteaAuthOptions.ClientId; + options.ClientSecret = giteaAuthOptions.ClientSecret; + options.ResponseType = "code"; + + options.SaveTokens = true; + }).Services; + } + + public static IApplicationBuilder UseInfrastructure(this IApplicationBuilder app) => app; +} + +public class GiteaAuthOptions +{ + [Required] public string Url { get; set; } + [Required] public string ClientId { get; init; } + [Required] public string ClientSecret { get; init; } +} \ No newline at end of file diff --git a/src/backend/server/Todo.Infrastructure/Todo.Infrastructure.csproj b/src/backend/server/Todo.Infrastructure/Todo.Infrastructure.csproj new file mode 100644 index 0000000..79bb0ac --- /dev/null +++ b/src/backend/server/Todo.Infrastructure/Todo.Infrastructure.csproj @@ -0,0 +1,17 @@ + + + + net6.0 + enable + enable + + + + + + + + + + + diff --git a/src/backend/server/Todo.sln b/src/backend/server/Todo.sln index fcd154c..6952180 100644 --- a/src/backend/server/Todo.sln +++ b/src/backend/server/Todo.sln @@ -6,6 +6,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Todo.Persistence", "src\Tod EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Todo.Core", "src\Todo.Core\Todo.Core.csproj", "{F134CAB6-15A5-45CB-8782-B61AB67B5C9C}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Todo.Infrastructure", "Todo.Infrastructure\Todo.Infrastructure.csproj", "{F6EE7E8D-6248-421E-9FB0-D4342908B319}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -24,5 +26,9 @@ Global {F134CAB6-15A5-45CB-8782-B61AB67B5C9C}.Debug|Any CPU.Build.0 = Debug|Any CPU {F134CAB6-15A5-45CB-8782-B61AB67B5C9C}.Release|Any CPU.ActiveCfg = Release|Any CPU {F134CAB6-15A5-45CB-8782-B61AB67B5C9C}.Release|Any CPU.Build.0 = Release|Any CPU + {F6EE7E8D-6248-421E-9FB0-D4342908B319}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F6EE7E8D-6248-421E-9FB0-D4342908B319}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F6EE7E8D-6248-421E-9FB0-D4342908B319}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F6EE7E8D-6248-421E-9FB0-D4342908B319}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal diff --git a/src/backend/server/src/Todo.Api/Controllers/TodosController.cs b/src/backend/server/src/Todo.Api/Controllers/TodosController.cs index a5fdc9f..d10ce0d 100644 --- a/src/backend/server/src/Todo.Api/Controllers/TodosController.cs +++ b/src/backend/server/src/Todo.Api/Controllers/TodosController.cs @@ -1,4 +1,5 @@ using System.ComponentModel.DataAnnotations; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Todo.Core.Interfaces.Persistence; @@ -20,10 +21,11 @@ public class TodosController : ControllerBase Ok(await _todoRepository.CreateTodoAsync(request.Title, String.Empty)); [HttpGet] + [Authorize] public async Task>> GetTodos() => Ok(await _todoRepository.GetTodosAsync()); - [HttpGet] + [HttpGet("not-done")] public async Task>> GetNotDoneTodos() => Ok(await _todoRepository.GetNotDoneTodos()); diff --git a/src/backend/server/src/Todo.Api/Properties/launchSettings.json b/src/backend/server/src/Todo.Api/Properties/launchSettings.json index 7793e59..cc48b0b 100644 --- a/src/backend/server/src/Todo.Api/Properties/launchSettings.json +++ b/src/backend/server/src/Todo.Api/Properties/launchSettings.json @@ -21,7 +21,10 @@ "MONGODB__Password": "example", "MONGODB__Database": "todo", "MONGODB__Host": "localhost", - "MONGODB__Port": "27017" + "MONGODB__Port": "27017", + "GITEA__Url": "https://git.front.kjuulh.io", + "GITEA__ClientId": "6982ef4f-cfc1-431c-a442-fad98355a059", + "GITEA__": "stabKPEZ6di0VfPjYT4rb0jRGLA2gPSd2NEkGoBi0xLO" } } } diff --git a/src/backend/server/src/Todo.Api/Startup.cs b/src/backend/server/src/Todo.Api/Startup.cs index 200e6fe..5e3f512 100644 --- a/src/backend/server/src/Todo.Api/Startup.cs +++ b/src/backend/server/src/Todo.Api/Startup.cs @@ -1,3 +1,4 @@ +using System.IdentityModel.Tokens.Jwt; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Diagnostics.HealthChecks; using Microsoft.AspNetCore.Hosting; @@ -7,6 +8,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.OpenApi.Models; using Todo.Api.Hubs; +using Todo.Infrastructure; using Todo.Persistence; using Todo.Persistence.Mongo; @@ -38,6 +40,9 @@ namespace Todo.Api { c.SwaggerDoc("v1", new OpenApiInfo { Title = "Todo.Api", Version = "v1" }); }); + JwtSecurityTokenHandler.DefaultMapInboundClaims = false; + + services.AddInfrastructure(Configuration); services.AddPersistence(Configuration, out var mongoDbOptions); services @@ -61,6 +66,7 @@ namespace Todo.Api app.UseRouting(); app.UseCors(); + app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => diff --git a/src/backend/server/src/Todo.Api/Todo.Api.csproj b/src/backend/server/src/Todo.Api/Todo.Api.csproj index 271006d..3b06d06 100644 --- a/src/backend/server/src/Todo.Api/Todo.Api.csproj +++ b/src/backend/server/src/Todo.Api/Todo.Api.csproj @@ -10,6 +10,7 @@ +