using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.OpenApi; using Microsoft.OpenApi.Models; namespace LANCommander.Server; // https://yogeshhadiya33.medium.com/implement-scalar-in-net-api-91d284479d1d internal sealed class BearerSecuritySchemeTransformer : IOpenApiDocumentTransformer { private readonly IAuthenticationSchemeProvider _authenticationSchemeProvider; public BearerSecuritySchemeTransformer(IAuthenticationSchemeProvider authenticationSchemeProvider) { _authenticationSchemeProvider = authenticationSchemeProvider; } public async Task TransformAsync(OpenApiDocument document, OpenApiDocumentTransformerContext context, CancellationToken cancellationToken) { var authenticationSchemes = await _authenticationSchemeProvider.GetAllSchemesAsync(); if (authenticationSchemes.Any(authScheme => authScheme.Name == "Bearer")) { var requirements = new Dictionary { ["Bearer"] = new OpenApiSecurityScheme { Type = SecuritySchemeType.Http, Scheme = "Bearer", In = ParameterLocation.Header, BearerFormat = "JWT" } }; document.Components ??= new OpenApiComponents(); document.Components.SecuritySchemes = requirements; foreach (var operation in document.Paths.Values.SelectMany(path => path.Operations)) { operation.Value.Security.Add(new OpenApiSecurityRequirement { [new OpenApiSecurityScheme { Reference = new OpenApiReference { Id = "Bearer", Type = ReferenceType.SecurityScheme } }] = Array.Empty() }); } } } }