Skip to content

Commit 512d919

Browse files
committed
feat(open-api): Enhance the swagger configuration
- Swagger has added the oauth config - The cors configuration can be a string array - Add cross-domain initialization configuration for the microservice oauth client
1 parent 843e597 commit 512d919

49 files changed

Lines changed: 596 additions & 266 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore/DataSeeder/ClientDataSeederContributor.cs

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Microsoft.Extensions.Configuration;
22
using OpenIddict.Abstractions;
33
using System;
4+
using System.Collections.Generic;
45
using System.Globalization;
56
using System.Threading.Tasks;
67
using Volo.Abp.Authorization.Permissions;
@@ -94,18 +95,18 @@ private async Task CreateApplicationAsync(string scope)
9495
await _applicationManager.CreateAsync(new OpenIddictApplicationDescriptor
9596
{
9697
ClientId = vueClientId,
97-
ClientSecret = "1q2w3e*",
98+
ClientSecret = configurationSection["VueAdmin:ClientSecret"],
9899
ApplicationType = OpenIddictConstants.ApplicationTypes.Web,
99100
ConsentType = OpenIddictConstants.ConsentTypes.Explicit,
100101
DisplayName = "Abp Vue Admin Client",
101102
PostLogoutRedirectUris =
102103
{
103-
new Uri(vueClientRootUrl + "signout-callback-oidc"),
104+
new Uri(vueClientRootUrl + "signout-callback"),
104105
new Uri(vueClientRootUrl)
105106
},
106107
RedirectUris =
107108
{
108-
new Uri(vueClientRootUrl + "/signin-oidc"),
109+
new Uri(vueClientRootUrl + "signin-callback"),
109110
new Uri(vueClientRootUrl)
110111
},
111112
Permissions =
@@ -158,7 +159,7 @@ await _applicationManager.CreateAsync(new OpenIddictApplicationDescriptor
158159
await _applicationManager.CreateAsync(new OpenIddictApplicationDescriptor
159160
{
160161
ClientId = internalServiceClientId,
161-
ClientSecret = "1q2w3e*",
162+
ClientSecret = configurationSection["InternalService:ClientSecret"],
162163
ClientType = OpenIddictConstants.ClientTypes.Confidential,
163164
ConsentType = OpenIddictConstants.ConsentTypes.Explicit,
164165
ApplicationType = OpenIddictConstants.ApplicationTypes.Native,
@@ -205,30 +206,22 @@ await _applicationManager.CreateAsync(new OpenIddictApplicationDescriptor
205206
}
206207
}
207208

208-
var oauthClientId = configurationSection["OAuthClient:ClientId"];
209+
var oauthClientId = configurationSection["VueOAuthClient:ClientId"];
209210
if (!oauthClientId.IsNullOrWhiteSpace())
210211
{
211-
var oauthClientRootUrl = configurationSection["OAuthClient:RootUrl"].EnsureEndsWith('/');
212+
var oauthClientRootUrls = configurationSection.GetSection("VueOAuthClient:RootUrls").Get<List<string>>();
212213

213214
if (await _applicationRepository.FindByClientIdAsync(oauthClientId) == null)
214215
{
215-
await _applicationManager.CreateAsync(new OpenIddictApplicationDescriptor
216+
var application = new OpenIddictApplicationDescriptor
216217
{
217218
ClientId = oauthClientId,
218219
ClientSecret = null,
219220
ApplicationType = OpenIddictConstants.ApplicationTypes.Web,
220221
ConsentType = OpenIddictConstants.ConsentTypes.Implicit,
221222
DisplayName = "OAuth Client",
222-
PostLogoutRedirectUris =
223-
{
224-
new Uri(oauthClientRootUrl + "signout-callback"),
225-
new Uri(oauthClientRootUrl)
226-
},
227-
RedirectUris =
228-
{
229-
new Uri(oauthClientRootUrl + "/signin-callback"),
230-
new Uri(oauthClientRootUrl)
231-
},
223+
PostLogoutRedirectUris = { },
224+
RedirectUris = { },
232225
Permissions =
233226
{
234227
OpenIddictConstants.Permissions.Endpoints.Authorization,
@@ -257,8 +250,20 @@ await _applicationManager.CreateAsync(new OpenIddictApplicationDescriptor
257250
OpenIddictConstants.Permissions.Scopes.Phone,
258251
OpenIddictConstants.Permissions.Prefixes.Scope + scope
259252
}
253+
};
254+
255+
oauthClientRootUrls.ForEach(url =>
256+
{
257+
application.PostLogoutRedirectUris.AddIfNotContains(new Uri(url.EnsureEndsWith('/')));
258+
application.PostLogoutRedirectUris.AddIfNotContains(new Uri(url.EnsureEndsWith('/') + "signout-callback"));
259+
260+
application.RedirectUris.AddIfNotContains(new Uri(url));
261+
application.RedirectUris.AddIfNotContains(new Uri(url.EnsureEndsWith('/') + "signin-callback"));
262+
application.RedirectUris.AddIfNotContains(new Uri(url.EnsureEndsWith('/') + "swagger/oauth2-redirect.html"));
260263
});
261264

265+
await _applicationManager.CreateAsync(application);
266+
262267
var oauthClientPermissions = new string[1]
263268
{
264269
"AbpIdentity.UserLookup"

aspnet-core/services/LY.MicroService.Applications.Single/LY.MicroService.Applications.Single.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
<PackageReference Include="Serilog.Settings.Configuration" />
3434
<PackageReference Include="Serilog.Sinks.Elasticsearch" />
3535
<PackageReference Include="Serilog.Sinks.File" />
36-
<PackageReference Include="Swashbuckle.AspNetCore" />
3736
<PackageReference Include="Quartz.Serialization.Json" />
3837
<PackageReference Include="Volo.Abp.Account.Web.OpenIddict" />
3938
<PackageReference Include="Volo.Abp.AspNetCore.Serilog" />
@@ -55,6 +54,7 @@
5554
<PackageReference Include="Volo.Abp.PermissionManagement.Web" />
5655
<PackageReference Include="Volo.Abp.SettingManagement.EntityFrameworkCore" />
5756
<PackageReference Include="Volo.Abp.SettingManagement.Web" />
57+
<PackageReference Include="Volo.Abp.Swashbuckle" />
5858
<PackageReference Include="Volo.Abp.Identity.AspNetCore" />
5959
<PackageReference Include="Volo.Abp.Identity.Web" />
6060
<PackageReference Include="Volo.Abp.VirtualFileExplorer.Web" />

aspnet-core/services/LY.MicroService.Applications.Single/MicroServiceApplicationsSingleModule.Configure.cs

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -610,13 +610,32 @@ private void ConfigureAuditing(IConfiguration configuration)
610610
});
611611
}
612612

613-
private void ConfigureSwagger(IServiceCollection services)
613+
private void ConfigureSwagger(IServiceCollection services, IConfiguration configuration)
614614
{
615615
// Swagger
616-
services.AddSwaggerGen(
616+
services.AddAbpSwaggerGenWithOAuth(
617+
configuration["AuthServer:Authority"],
618+
new Dictionary<string, string>
619+
{
620+
{ configuration["AuthServer:Audience"], "Single APP"}
621+
},
617622
options =>
618623
{
619-
options.SwaggerDoc("v1", new OpenApiInfo { Title = "App API", Version = "v1" });
624+
options.SwaggerDoc("v1", new OpenApiInfo
625+
{
626+
Title = "Single APP API", Version = "v1",
627+
Contact = new OpenApiContact
628+
{
629+
Name = "colin",
630+
Email = "colin.in@foxmail.com",
631+
Url = new Uri("https://github.com/colinin")
632+
},
633+
License = new OpenApiLicense
634+
{
635+
Name = "MIT",
636+
Url = new Uri("https://github.com/colinin/abp-next-admin/blob/master/LICENSE")
637+
}
638+
});
620639
options.DocInclusionPredicate((docName, description) => true);
621640
options.CustomSchemaIds(type => type.FullName);
622641
options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
@@ -630,13 +649,13 @@ private void ConfigureSwagger(IServiceCollection services)
630649
});
631650
options.AddSecurityRequirement(new OpenApiSecurityRequirement
632651
{
652+
{
653+
new OpenApiSecurityScheme
633654
{
634-
new OpenApiSecurityScheme
635-
{
636-
Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" }
637-
},
638-
new string[] { }
639-
}
655+
Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" }
656+
},
657+
new string[] { }
658+
}
640659
});
641660
options.OperationFilter<TenantHeaderParamter>();
642661
});
@@ -896,12 +915,18 @@ private void ConfigureCors(IServiceCollection services, IConfiguration configura
896915
{
897916
options.AddDefaultPolicy(builder =>
898917
{
918+
var corsOrigins = configuration.GetSection("App:CorsOrigins").Get<List<string>>();
919+
if (corsOrigins == null || corsOrigins.Count == 0)
920+
{
921+
corsOrigins = configuration["App:CorsOrigins"]?
922+
.Split(",", StringSplitOptions.RemoveEmptyEntries)
923+
.Select(o => o.RemovePostFix("/"))
924+
.ToList() ?? new List<string>();
925+
}
899926
builder
900-
.WithOrigins(
901-
configuration["App:CorsOrigins"]
902-
.Split(",", StringSplitOptions.RemoveEmptyEntries)
903-
.Select(o => o.RemovePostFix("/"))
904-
.ToArray()
927+
.WithOrigins(corsOrigins
928+
.Select(o => o.RemovePostFix("/"))
929+
.ToArray()
905930
)
906931
.WithAbpExposedHeaders()
907932
.WithAbpWrapExposedHeaders()

aspnet-core/services/LY.MicroService.Applications.Single/MicroServiceApplicationsSingleModule.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using Volo.Abp.Swashbuckle;
2+
13
namespace LY.MicroService.Applications.Single;
24

35
[DependsOn(
@@ -370,6 +372,7 @@ namespace LY.MicroService.Applications.Single;
370372
typeof(AbpAspNetCoreMvcWrapperModule),
371373
typeof(AbpAspNetCoreMvcIdempotentWrapperModule),
372374
typeof(AbpAspNetCoreHttpOverridesModule),
375+
typeof(AbpSwashbuckleModule),
373376
typeof(AbpMailKitModule),
374377
typeof(AbpAutofacModule),
375378

@@ -418,7 +421,6 @@ public override void ConfigureServices(ServiceConfigurationContext context)
418421
ConfigureIdentity(configuration);
419422
ConfigureDbContext(configuration);
420423
ConfigureAuthServer(configuration);
421-
ConfigureSwagger(context.Services);
422424
ConfigureEndpoints(context.Services);
423425
ConfigureMultiTenancy(configuration);
424426
ConfigureJsonSerializer(configuration);
@@ -429,6 +431,7 @@ public override void ConfigureServices(ServiceConfigurationContext context)
429431
ConfigurePermissionManagement(configuration);
430432
ConfigureNotificationManagement(configuration);
431433
ConfigureCors(context.Services, configuration);
434+
ConfigureSwagger(context.Services, configuration);
432435
ConfigureOssManagement(context.Services, configuration);
433436
ConfigureDistributedLock(context.Services, configuration);
434437
ConfigureKestrelServer(configuration, hostingEnvironment);

aspnet-core/services/LY.MicroService.Applications.Single/Program.cs

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,6 @@
44
using Volo.Abp.Modularity.PlugIns;
55

66
var builder = WebApplication.CreateBuilder(args);
7-
builder.Services.AddCors(options =>
8-
{
9-
options.AddDefaultPolicy(policy =>
10-
{
11-
policy
12-
.WithOrigins(
13-
builder.Configuration["App:CorsOrigins"]
14-
.Split(",", StringSplitOptions.RemoveEmptyEntries)
15-
.Select(o => o.RemovePostFix("/"))
16-
.ToArray()
17-
)
18-
.WithAbpExposedHeaders()
19-
.WithAbpWrapExposedHeaders()
20-
.SetIsOriginAllowedToAllowWildcardSubdomains()
21-
.AllowAnyHeader()
22-
.AllowAnyMethod()
23-
.AllowCredentials();
24-
});
25-
});
267
builder.Host.AddAppSettingsSecretsJson()
278
.UseAutofac()
289
.ConfigureAppConfiguration((context, config) =>
@@ -81,9 +62,12 @@ await builder.AddApplicationAsync<MicroServiceApplicationsSingleModule>(options
8162
app.UseDynamicClaims();
8263
app.UseAuthorization();
8364
app.UseSwagger();
84-
app.UseSwaggerUI(options =>
65+
app.UseAbpSwaggerUI(options =>
8566
{
86-
options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support App API");
67+
options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support Single APP API");
68+
69+
options.OAuthClientId(app.Configuration["AuthServer:SwaggerClientId"]);
70+
options.OAuthScopes(app.Configuration["AuthServer:Audience"]);
8771
});
8872
app.UseAuditing();
8973
app.UseAbpSerilogEnrichers();

aspnet-core/services/LY.MicroService.Applications.Single/appsettings.Development.json

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"App": {
33
"ShowPii": true,
44
"SelfUrl": "http://127.0.0.1:30001/",
5-
"CorsOrigins": "http://127.0.0.1:3100,http://localhost:5666,http://127.0.0.1:30001",
5+
"CorsOrigins": [ "http://127.0.0.1:5666", "http://127.0.0.1:30001" ],
66
"Urls": {
77
"Applications": {
88
"MVC": {
@@ -149,8 +149,7 @@
149149
"Authority": "http://127.0.0.1:30001/",
150150
"Audience": "lingyun-abp-application",
151151
"RequireHttpsMetadata": false,
152-
"SwaggerClientId": "InternalServiceClient",
153-
"SwaggerClientSecret": "1q2w3E*"
152+
"SwaggerClientId": "vue-oauth-client"
154153
},
155154
"IdentityServer": {
156155
"Clients": {
@@ -172,9 +171,12 @@
172171
"InternalService": {
173172
"ClientId": "InternalServiceClient"
174173
},
175-
"OAuthClient": {
174+
"VueOAuthClient": {
176175
"ClientId": "vue-oauth-client",
177-
"RootUrl": "http://localhost:5666"
176+
"RootUrls": [
177+
"http://127.0.0.1:5666",
178+
"http://127.0.0.1:30001"
179+
]
178180
}
179181
},
180182
"Lifetime": {

aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/AuthServerHttpApiHostModule.Configure.cs

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -364,13 +364,32 @@ private void ConfigureIdentity()
364364
});
365365
}
366366

367-
private void ConfigureSwagger(IServiceCollection services)
367+
private void ConfigureSwagger(IServiceCollection services, IConfiguration configuration)
368368
{
369369
// Swagger
370-
services.AddSwaggerGen(
370+
services.AddAbpSwaggerGenWithOAuth(
371+
configuration["AuthServer:Authority"],
372+
new Dictionary<string, string>
373+
{
374+
{ configuration["AuthServer:Audience"], "Identity Service API"}
375+
},
371376
options =>
372377
{
373-
options.SwaggerDoc("v1", new OpenApiInfo { Title = "AuthServer API", Version = "v1" });
378+
options.SwaggerDoc("v1", new OpenApiInfo
379+
{
380+
Title = "Identity Service API", Version = "v1",
381+
Contact = new OpenApiContact
382+
{
383+
Name = "colin",
384+
Email = "colin.in@foxmail.com",
385+
Url = new Uri("https://github.com/colinin")
386+
},
387+
License = new OpenApiLicense
388+
{
389+
Name = "MIT",
390+
Url = new Uri("https://github.com/colinin/abp-next-admin/blob/master/LICENSE")
391+
}
392+
});
374393
options.DocInclusionPredicate((docName, description) => true);
375394
options.CustomSchemaIds(type => type.FullName);
376395
options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
@@ -429,12 +448,18 @@ private void ConfigureCors(IServiceCollection services, IConfiguration configura
429448
{
430449
options.AddDefaultPolicy(builder =>
431450
{
451+
var corsOrigins = configuration.GetSection("App:CorsOrigins").Get<List<string>>();
452+
if (corsOrigins == null || corsOrigins.Count == 0)
453+
{
454+
corsOrigins = configuration["App:CorsOrigins"]?
455+
.Split(",", StringSplitOptions.RemoveEmptyEntries)
456+
.Select(o => o.RemovePostFix("/"))
457+
.ToList() ?? new List<string>();
458+
}
432459
builder
433-
.WithOrigins(
434-
configuration["App:CorsOrigins"]
435-
.Split(",", StringSplitOptions.RemoveEmptyEntries)
436-
.Select(o => o.RemovePostFix("/"))
437-
.ToArray()
460+
.WithOrigins(corsOrigins
461+
.Select(o => o.RemovePostFix("/"))
462+
.ToArray()
438463
)
439464
.WithAbpExposedHeaders()
440465
.WithAbpWrapExposedHeaders()

0 commit comments

Comments
 (0)