2
2
3
3
import java .lang .reflect .Field ;
4
4
5
- import com .nimbusds .jose .jwk .JWKSet ;
6
5
import io .swagger .v3 .oas .annotations .enums .ParameterIn ;
7
6
import io .swagger .v3 .oas .models .OpenAPI ;
8
7
import io .swagger .v3 .oas .models .Operation ;
9
8
import io .swagger .v3 .oas .models .PathItem ;
10
9
import io .swagger .v3 .oas .models .headers .Header ;
10
+ import io .swagger .v3 .oas .models .media .ArraySchema ;
11
11
import io .swagger .v3 .oas .models .media .Content ;
12
+ import io .swagger .v3 .oas .models .media .MapSchema ;
12
13
import io .swagger .v3 .oas .models .media .MediaType ;
13
14
import io .swagger .v3 .oas .models .media .ObjectSchema ;
14
15
import io .swagger .v3 .oas .models .media .Schema ;
21
22
import org .slf4j .Logger ;
22
23
import org .slf4j .LoggerFactory ;
23
24
import org .springdoc .core .configuration .oauth2 .SpringDocOAuth2AuthorizationServerMetadata ;
25
+ import org .springdoc .core .configuration .oauth2 .SpringDocOAuth2Token ;
24
26
import org .springdoc .core .configuration .oauth2 .SpringDocOAuth2TokenIntrospection ;
25
27
import org .springdoc .core .customizers .GlobalOpenApiCustomizer ;
26
28
import org .springdoc .core .utils .SpringDocAnnotationsUtils ;
31
33
import org .springframework .http .HttpMethod ;
32
34
import org .springframework .http .HttpStatus ;
33
35
import org .springframework .security .oauth2 .core .OAuth2Error ;
34
- import org .springframework .security .oauth2 .core .endpoint .OAuth2AccessTokenResponse ;
35
36
import org .springframework .security .oauth2 .core .endpoint .OAuth2ParameterNames ;
36
- import org .springframework .security .oauth2 .server .authorization .authentication .OAuth2AuthorizationConsentAuthenticationToken ;
37
- import org .springframework .security .oauth2 .server .authorization .authentication .OAuth2TokenRevocationAuthenticationToken ;
38
37
import org .springframework .security .oauth2 .server .authorization .web .NimbusJwkSetEndpointFilter ;
39
38
import org .springframework .security .oauth2 .server .authorization .web .OAuth2AuthorizationEndpointFilter ;
40
39
import org .springframework .security .oauth2 .server .authorization .web .OAuth2AuthorizationServerMetadataEndpointFilter ;
49
48
import org .springframework .security .web .util .matcher .RequestMatcher ;
50
49
51
50
import static org .springframework .http .MediaType .APPLICATION_JSON_VALUE ;
51
+ import static org .springframework .http .MediaType .TEXT_HTML_VALUE ;
52
52
53
53
/**
54
54
* The type Spring doc security o auth 2 customizer.
@@ -95,7 +95,10 @@ private void getOAuth2TokenRevocationEndpointFilter(OpenAPI openAPI, SecurityFil
95
95
Object oAuth2EndpointFilter =
96
96
new SpringDocSecurityOAuth2EndpointUtils (OAuth2TokenRevocationEndpointFilter .class ).findEndpoint (securityFilterChain );
97
97
if (oAuth2EndpointFilter != null ) {
98
- ApiResponses apiResponses = buildApiResponsesWithBadRequest (SpringDocAnnotationsUtils .resolveSchemaFromType (OAuth2TokenRevocationAuthenticationToken .class , openAPI .getComponents (), null ), openAPI );
98
+ ApiResponses apiResponses = new ApiResponses ();
99
+ apiResponses .addApiResponse (String .valueOf (HttpStatus .OK .value ()), new ApiResponse ().description (HttpStatus .OK .getReasonPhrase ()));
100
+ buildApiResponsesOnInternalServerError (apiResponses );
101
+ buildApiResponsesOnBadRequest (apiResponses , openAPI );
99
102
100
103
Operation operation = buildOperation (apiResponses );
101
104
Schema <?> schema = new ObjectSchema ()
@@ -119,15 +122,19 @@ private void getOAuth2TokenIntrospectionEndpointFilter(OpenAPI openAPI, Security
119
122
Object oAuth2EndpointFilter =
120
123
new SpringDocSecurityOAuth2EndpointUtils (OAuth2TokenIntrospectionEndpointFilter .class ).findEndpoint (securityFilterChain );
121
124
if (oAuth2EndpointFilter != null ) {
122
- ApiResponses apiResponses = buildApiResponsesWithBadRequest (SpringDocAnnotationsUtils .resolveSchemaFromType (SpringDocOAuth2TokenIntrospection .class , openAPI .getComponents (), null ), openAPI );
125
+ ApiResponses apiResponses = new ApiResponses ();
126
+ buildApiResponsesOnSuccess (apiResponses , SpringDocAnnotationsUtils .resolveSchemaFromType (SpringDocOAuth2TokenIntrospection .class , openAPI .getComponents (), null ));
127
+ buildApiResponsesOnInternalServerError (apiResponses );
128
+ buildApiResponsesOnBadRequest (apiResponses , openAPI );
129
+
123
130
Operation operation = buildOperation (apiResponses );
124
- Schema <?> schema = new ObjectSchema ()
131
+ Schema <?> requestSchema = new ObjectSchema ()
125
132
.addProperty ("token" , new StringSchema ())
126
133
.addProperty (OAuth2ParameterNames .TOKEN_TYPE_HINT , new StringSchema ())
127
134
.addProperty ("additionalParameters" , new ObjectSchema ().additionalProperties (new StringSchema ()));
128
135
129
136
String mediaType = org .springframework .http .MediaType .APPLICATION_FORM_URLENCODED_VALUE ;
130
- RequestBody requestBody = new RequestBody ().content (new Content ().addMediaType (mediaType , new MediaType ().schema (schema )));
137
+ RequestBody requestBody = new RequestBody ().content (new Content ().addMediaType (mediaType , new MediaType ().schema (requestSchema )));
131
138
operation .setRequestBody (requestBody );
132
139
buildPath (oAuth2EndpointFilter , "tokenIntrospectionEndpointMatcher" , openAPI , operation , HttpMethod .POST );
133
140
}
@@ -143,7 +150,9 @@ private void getOAuth2AuthorizationServerMetadataEndpoint(OpenAPI openAPI, Secur
143
150
Object oAuth2EndpointFilter =
144
151
new SpringDocSecurityOAuth2EndpointUtils (OAuth2AuthorizationServerMetadataEndpointFilter .class ).findEndpoint (securityFilterChain );
145
152
if (oAuth2EndpointFilter != null ) {
146
- ApiResponses apiResponses = buildApiResponses (SpringDocAnnotationsUtils .resolveSchemaFromType (SpringDocOAuth2AuthorizationServerMetadata .class , openAPI .getComponents (), null ));
153
+ ApiResponses apiResponses = new ApiResponses ();
154
+ buildApiResponsesOnSuccess (apiResponses , SpringDocAnnotationsUtils .resolveSchemaFromType (SpringDocOAuth2AuthorizationServerMetadata .class , openAPI .getComponents (), null ));
155
+ buildApiResponsesOnInternalServerError (apiResponses );
147
156
Operation operation = buildOperation (apiResponses );
148
157
buildPath (oAuth2EndpointFilter , "requestMatcher" , openAPI , operation , HttpMethod .GET );
149
158
}
@@ -159,7 +168,17 @@ private void getNimbusJwkSetEndpoint(OpenAPI openAPI, SecurityFilterChain securi
159
168
Object oAuth2EndpointFilter =
160
169
new SpringDocSecurityOAuth2EndpointUtils (NimbusJwkSetEndpointFilter .class ).findEndpoint (securityFilterChain );
161
170
if (oAuth2EndpointFilter != null ) {
162
- ApiResponses apiResponses = buildApiResponses (SpringDocAnnotationsUtils .resolveSchemaFromType (JWKSet .class , openAPI .getComponents (), null ));
171
+ ApiResponses apiResponses = new ApiResponses ();
172
+ Schema <?> schema = new MapSchema ();
173
+ schema .addProperty ("keys" , new ArraySchema ().items (new ObjectSchema ().additionalProperties (true )));
174
+
175
+ ApiResponse response = new ApiResponse ().description (HttpStatus .OK .getReasonPhrase ()).content (new Content ().addMediaType (
176
+ APPLICATION_JSON_VALUE ,
177
+ new MediaType ().schema (schema )));
178
+ apiResponses .addApiResponse (String .valueOf (HttpStatus .OK .value ()), response );
179
+ buildApiResponsesOnInternalServerError (apiResponses );
180
+ buildApiResponsesOnBadRequest (apiResponses , openAPI );
181
+
163
182
Operation operation = buildOperation (apiResponses );
164
183
operation .responses (apiResponses );
165
184
buildPath (oAuth2EndpointFilter , "requestMatcher" , openAPI , operation , HttpMethod .GET );
@@ -177,7 +196,10 @@ private void getOAuth2TokenEndpoint(OpenAPI openAPI, SecurityFilterChain securit
177
196
new SpringDocSecurityOAuth2EndpointUtils (OAuth2TokenEndpointFilter .class ).findEndpoint (securityFilterChain );
178
197
179
198
if (oAuth2EndpointFilter != null ) {
180
- ApiResponses apiResponses = buildApiResponsesWithBadRequest (SpringDocAnnotationsUtils .resolveSchemaFromType (OAuth2AccessTokenResponse .class , openAPI .getComponents (), null ), openAPI );
199
+ ApiResponses apiResponses = new ApiResponses ();
200
+ buildApiResponsesOnSuccess (apiResponses , SpringDocAnnotationsUtils .resolveSchemaFromType (SpringDocOAuth2Token .class , openAPI .getComponents (), null ));
201
+ buildApiResponsesOnInternalServerError (apiResponses );
202
+ buildApiResponsesOnBadRequest (apiResponses , openAPI );
181
203
buildOAuth2Error (openAPI , apiResponses , HttpStatus .UNAUTHORIZED );
182
204
Operation operation = buildOperation (apiResponses );
183
205
Schema <?> schema = new ObjectSchema ().additionalProperties (new StringSchema ());
@@ -196,7 +218,14 @@ private void getOAuth2AuthorizationEndpoint(OpenAPI openAPI, SecurityFilterChain
196
218
Object oAuth2EndpointFilter =
197
219
new SpringDocSecurityOAuth2EndpointUtils (OAuth2AuthorizationEndpointFilter .class ).findEndpoint (securityFilterChain );
198
220
if (oAuth2EndpointFilter != null ) {
199
- ApiResponses apiResponses = buildApiResponsesWithBadRequest (SpringDocAnnotationsUtils .resolveSchemaFromType (OAuth2AuthorizationConsentAuthenticationToken .class , openAPI .getComponents (), null ), openAPI );
221
+ ApiResponses apiResponses = new ApiResponses ();
222
+
223
+ ApiResponse response = new ApiResponse ().description (HttpStatus .OK .getReasonPhrase ()).content (new Content ().addMediaType (
224
+ TEXT_HTML_VALUE ,
225
+ new MediaType ()));
226
+ apiResponses .addApiResponse (String .valueOf (HttpStatus .OK .value ()), response );
227
+ buildApiResponsesOnInternalServerError (apiResponses );
228
+ buildApiResponsesOnBadRequest (apiResponses , openAPI );
200
229
apiResponses .addApiResponse (String .valueOf (HttpStatus .MOVED_TEMPORARILY .value ()),
201
230
new ApiResponse ().description (HttpStatus .MOVED_TEMPORARILY .getReasonPhrase ())
202
231
.addHeaderObject ("Location" , new Header ().schema (new StringSchema ())));
@@ -221,30 +250,39 @@ private Operation buildOperation(ApiResponses apiResponses) {
221
250
}
222
251
223
252
/**
224
- * Build api responses api responses.
253
+ * Build api responses api responses on success .
225
254
*
255
+ * @param apiResponses the api responses
226
256
* @param schema the schema
227
257
* @return the api responses
228
258
*/
229
- private ApiResponses buildApiResponses (Schema schema ) {
230
- ApiResponses apiResponses = new ApiResponses ();
259
+ private ApiResponses buildApiResponsesOnSuccess (ApiResponses apiResponses , Schema schema ) {
231
260
ApiResponse response = new ApiResponse ().description (HttpStatus .OK .getReasonPhrase ()).content (new Content ().addMediaType (
232
261
APPLICATION_JSON_VALUE ,
233
262
new MediaType ().schema (schema )));
234
263
apiResponses .addApiResponse (String .valueOf (HttpStatus .OK .value ()), response );
264
+ return apiResponses ;
265
+ }
266
+
267
+ /**
268
+ * Build api responses api responses on internal server error.
269
+ *
270
+ * @param apiResponses the api responses
271
+ * @return the api responses
272
+ */
273
+ private ApiResponses buildApiResponsesOnInternalServerError (ApiResponses apiResponses ) {
235
274
apiResponses .addApiResponse (String .valueOf (HttpStatus .INTERNAL_SERVER_ERROR .value ()), new ApiResponse ().description (HttpStatus .INTERNAL_SERVER_ERROR .getReasonPhrase ()));
236
275
return apiResponses ;
237
276
}
238
277
239
278
/**
240
- * Build api responses with bad request api responses .
279
+ * Build api responses on bad request.
241
280
*
242
- * @param schema the schema
281
+ * @param apiResponses the api responses
243
282
* @param openAPI the open api
244
283
* @return the api responses
245
284
*/
246
- private ApiResponses buildApiResponsesWithBadRequest (Schema schema , OpenAPI openAPI ) {
247
- ApiResponses apiResponses = buildApiResponses (schema );
285
+ private ApiResponses buildApiResponsesOnBadRequest (ApiResponses apiResponses , OpenAPI openAPI ) {
248
286
buildOAuth2Error (openAPI , apiResponses , HttpStatus .BAD_REQUEST );
249
287
return apiResponses ;
250
288
}
0 commit comments