Skip to content

Commit 0505ff5

Browse files
authored
Fix security scheme issues in Delivery API OpenAPI spec (#17401)
1 parent 691ca28 commit 0505ff5

File tree

3 files changed

+55
-20
lines changed

3 files changed

+55
-20
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using Microsoft.OpenApi.Models;
2+
using Swashbuckle.AspNetCore.SwaggerGen;
3+
4+
namespace Umbraco.Cms.Api.Common.OpenApi;
5+
6+
/// <summary>
7+
/// This filter explicitly removes all security schemes from a named OpenAPI document.
8+
/// </summary>
9+
public class RemoveSecuritySchemesDocumentFilter : IDocumentFilter
10+
{
11+
private readonly string _documentName;
12+
13+
public RemoveSecuritySchemesDocumentFilter(string documentName)
14+
=> _documentName = documentName;
15+
16+
public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
17+
{
18+
if (context.DocumentName != _documentName)
19+
{
20+
return;
21+
}
22+
23+
swaggerDoc.Components.SecuritySchemes.Clear();
24+
}
25+
}

src/Umbraco.Cms.Api.Delivery/Configuration/ConfigureUmbracoDeliveryApiSwaggerGenOptions.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public void Configure(SwaggerGenOptions swaggerGenOptions)
2121
});
2222

2323
swaggerGenOptions.DocumentFilter<MimeTypeDocumentFilter>(DeliveryApiConfiguration.ApiName);
24+
swaggerGenOptions.DocumentFilter<RemoveSecuritySchemesDocumentFilter>(DeliveryApiConfiguration.ApiName);
2425

2526
swaggerGenOptions.OperationFilter<SwaggerContentDocumentationFilter>();
2627
swaggerGenOptions.OperationFilter<SwaggerMediaDocumentationFilter>();

src/Umbraco.Cms.Api.Delivery/Configuration/ConfigureUmbracoMemberAuthenticationDeliveryApiSwaggerGenOptions.cs

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,33 +17,16 @@ namespace Umbraco.Cms.Api.Delivery.Configuration;
1717
/// </remarks>
1818
public class ConfigureUmbracoMemberAuthenticationDeliveryApiSwaggerGenOptions : IConfigureOptions<SwaggerGenOptions>
1919
{
20-
private const string AuthSchemeName = "Umbraco Member";
20+
private const string AuthSchemeName = "UmbracoMember";
2121

2222
public void Configure(SwaggerGenOptions options)
2323
{
24-
options.AddSecurityDefinition(
25-
AuthSchemeName,
26-
new OpenApiSecurityScheme
27-
{
28-
In = ParameterLocation.Header,
29-
Name = AuthSchemeName,
30-
Type = SecuritySchemeType.OAuth2,
31-
Description = "Umbraco Member Authentication",
32-
Flows = new OpenApiOAuthFlows
33-
{
34-
AuthorizationCode = new OpenApiOAuthFlow
35-
{
36-
AuthorizationUrl = new Uri(Paths.MemberApi.AuthorizationEndpoint, UriKind.Relative),
37-
TokenUrl = new Uri(Paths.MemberApi.TokenEndpoint, UriKind.Relative)
38-
}
39-
}
40-
});
41-
4224
// add security requirements for content API operations
25+
options.DocumentFilter<DeliveryApiSecurityFilter>();
4326
options.OperationFilter<DeliveryApiSecurityFilter>();
4427
}
4528

46-
private class DeliveryApiSecurityFilter : SwaggerFilterBase<ContentApiControllerBase>, IOperationFilter
29+
private class DeliveryApiSecurityFilter : SwaggerFilterBase<ContentApiControllerBase>, IOperationFilter, IDocumentFilter
4730
{
4831
public void Apply(OpenApiOperation operation, OperationFilterContext context)
4932
{
@@ -70,5 +53,31 @@ public void Apply(OpenApiOperation operation, OperationFilterContext context)
7053
}
7154
};
7255
}
56+
57+
public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
58+
{
59+
if (context.DocumentName != DeliveryApiConfiguration.ApiName)
60+
{
61+
return;
62+
}
63+
64+
swaggerDoc.Components.SecuritySchemes.Add(
65+
AuthSchemeName,
66+
new OpenApiSecurityScheme
67+
{
68+
In = ParameterLocation.Header,
69+
Name = AuthSchemeName,
70+
Type = SecuritySchemeType.OAuth2,
71+
Description = "Umbraco Member Authentication",
72+
Flows = new OpenApiOAuthFlows
73+
{
74+
AuthorizationCode = new OpenApiOAuthFlow
75+
{
76+
AuthorizationUrl = new Uri(Paths.MemberApi.AuthorizationEndpoint, UriKind.Relative),
77+
TokenUrl = new Uri(Paths.MemberApi.TokenEndpoint, UriKind.Relative)
78+
}
79+
}
80+
});
81+
}
7382
}
7483
}

0 commit comments

Comments
 (0)