using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.OpenApi; using Microsoft.OpenApi; namespace Milimoe.FunGame.WebAPI.Architecture { public class SecurityDocumentTransformer(IAuthenticationSchemeProvider authenticationSchemeProvider) : IOpenApiDocumentTransformer { public async Task TransformAsync(OpenApiDocument document, OpenApiDocumentTransformerContext context, CancellationToken cancellationToken) { IEnumerable authenticationSchemes = await authenticationSchemeProvider.GetAllSchemesAsync(); if (authenticationSchemes.Any(authScheme => authScheme.Name == "Bearer")) { Dictionary securitySchemes = new() { ["Bearer"] = new OpenApiSecurityScheme { Type = SecuritySchemeType.Http, Scheme = "bearer", BearerFormat = "JWT", In = ParameterLocation.Header } }; document.Components ??= new OpenApiComponents(); document.Components.SecuritySchemes = securitySchemes; foreach (KeyValuePair operation in document.Paths.Values.SelectMany(path => path.Operations!)) { operation.Value.Security ??= []; operation.Value.Security.Add(new OpenApiSecurityRequirement { [new OpenApiSecuritySchemeReference("Bearer", document)] = [] }); } } document.Info = new() { Title = "FunGame Web API", Version = "v1", Description = "Welcome to FunGame Web API document." }; } } }