Skip to content

Commit d011460

Browse files
committed
Include /oauth/token endpoint using OpenApi Swagger 1.6.5. Fixes #1481
1 parent 5f29c79 commit d011460

File tree

15 files changed

+401
-9
lines changed

15 files changed

+401
-9
lines changed

pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@
8080
<spring-native.version>0.11.1</spring-native.version>
8181
<therapi-runtime-javadoc.version>0.13.0</therapi-runtime-javadoc.version>
8282
<spring-cloud.version>2021.0.0</spring-cloud.version>
83+
<spring-cloud-netflix.version>2.2.10.RELEASE</spring-cloud-netflix.version>
8384
</properties>
8485

8586
<dependencyManagement>
@@ -208,6 +209,11 @@
208209
<type>pom</type>
209210
<scope>import</scope>
210211
</dependency>
212+
<dependency>
213+
<groupId>org.springframework.cloud</groupId>
214+
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
215+
<version>${spring-cloud-netflix.version}</version>
216+
</dependency>
211217
</dependencies>
212218
</dependencyManagement>
213219
<dependencies>

springdoc-openapi-security/pom.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,16 @@
5252
<artifactId>jjwt</artifactId>
5353
<scope>test</scope>
5454
</dependency>
55+
<dependency>
56+
<groupId>org.aspectj</groupId>
57+
<artifactId>aspectjrt</artifactId>
58+
<scope>test</scope>
59+
</dependency>
60+
<dependency>
61+
<groupId>org.springframework.cloud</groupId>
62+
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
63+
<scope>test</scope>
64+
</dependency>
5565
</dependencies>
5666
<build>
5767
<plugins>

springdoc-openapi-security/src/test/java/test/org/springdoc/api/app1/SpringDocApp1Test.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828

2929
public class SpringDocApp1Test extends AbstractSpringDocTest {
3030

31-
@SpringBootApplication(scanBasePackages = { "test.org.springdoc.api.configuration,test.org.springdoc.api.app1" })
31+
@SpringBootApplication(scanBasePackages = { "test.org.springdoc.api.configuration","test.org.springdoc.api.app1" })
3232
static class SpringDocTestApp {
3333
@Bean
3434
public OpenAPI customOpenAPI() {

springdoc-openapi-security/src/test/java/test/org/springdoc/api/app2/SpringDocApp2Test.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828

2929
public class SpringDocApp2Test extends AbstractSpringDocTest {
3030

31-
@SpringBootApplication(scanBasePackages = { "test.org.springdoc.api.configuration,test.org.springdoc.api.app2" })
31+
@SpringBootApplication(scanBasePackages = { "test.org.springdoc.api.configuration","test.org.springdoc.api.app2" })
3232
static class SpringDocTestApp {
3333
@Bean
3434
public OpenAPI customOpenAPI() {

springdoc-openapi-security/src/test/java/test/org/springdoc/api/app4/SpringDocApp4Test.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public void configurations_successfully_loaded() {
4141
);
4242
}
4343

44-
@SpringBootApplication(scanBasePackages = { "test.org.springdoc.api.configuration,test.org.springdoc.api.app4" })
44+
@SpringBootApplication(scanBasePackages = { "test.org.springdoc.api.configuration","test.org.springdoc.api.app4" })
4545
@EnableAuthorizationServer
4646
static class TestApp {
4747
}

springdoc-openapi-security/src/test/java/test/org/springdoc/api/app5/SpringDocApp5Test.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424

2525
public class SpringDocApp5Test extends AbstractSpringDocTest {
2626

27-
@SpringBootApplication(scanBasePackages = { "test.org.springdoc.api.configuration,test.org.springdoc.api.app5" })
27+
@SpringBootApplication(scanBasePackages = { "test.org.springdoc.api.configuration","test.org.springdoc.api.app5" })
2828
static class SpringDocTestApp {}
2929

3030
}

springdoc-openapi-security/src/test/java/test/org/springdoc/api/app6/SpringDocApp6Test.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
@TestPropertySource(properties = "springdoc.show-login-endpoint=true")
2929
public class SpringDocApp6Test extends AbstractSpringDocTest {
3030

31-
@SpringBootApplication(scanBasePackages = { "test.org.springdoc.api.configuration,test.org.springdoc.api.app6" })
31+
@SpringBootApplication(scanBasePackages = { "test.org.springdoc.api.configuration","test.org.springdoc.api.app6" })
3232
static class SpringDocTestApp {
3333
@Bean
3434
MyUserDetailsService userDetailsService() {

springdoc-openapi-security/src/test/java/test/org/springdoc/api/app7/SpringDocApp7Test.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828

2929
public class SpringDocApp7Test extends AbstractSpringDocTest {
3030

31-
@SpringBootApplication(scanBasePackages = { "test.org.springdoc.api.configuration,test.org.springdoc.api.app7" })
31+
@SpringBootApplication(scanBasePackages = { "test.org.springdoc.api.configuration","test.org.springdoc.api.app7" })
3232
static class SpringDocTestApp {
3333
@Bean
3434
public OpenAPI customOpenAPI() {

springdoc-openapi-security/src/test/java/test/org/springdoc/api/app8/SpringDocApp8Test.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
@TestPropertySource(properties = "springdoc.show-login-endpoint=true")
1313
public class SpringDocApp8Test extends AbstractSpringDocTest {
1414

15-
@SpringBootApplication(scanBasePackages = { "test.org.springdoc.api.configuration,test.org.springdoc.api.app8" })
15+
@SpringBootApplication(scanBasePackages = { "test.org.springdoc.api.configuration","test.org.springdoc.api.app8" })
1616
static class SpringDocTestApp {
1717
@Bean
1818
public OpenAPI customOpenAPI() {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/*
2+
*
3+
* * Copyright 2019-2020 the original author or authors.
4+
* *
5+
* * Licensed under the Apache License, Version 2.0 (the "License");
6+
* * you may not use this file except in compliance with the License.
7+
* * You may obtain a copy of the License at
8+
* *
9+
* * https://www.apache.org/licenses/LICENSE-2.0
10+
* *
11+
* * Unless required by applicable law or agreed to in writing, software
12+
* * distributed under the License is distributed on an "AS IS" BASIS,
13+
* * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* * See the License for the specific language governing permissions and
15+
* * limitations under the License.
16+
*
17+
*/
18+
19+
package test.org.springdoc.api.app9;
20+
21+
import org.springframework.beans.factory.annotation.Autowired;
22+
import org.springframework.context.annotation.Configuration;
23+
import org.springframework.security.authentication.AuthenticationManager;
24+
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
25+
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
26+
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
27+
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer;
28+
import org.springframework.security.oauth2.provider.token.store.InMemoryTokenStore;
29+
30+
@Configuration
31+
class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {
32+
33+
@Autowired
34+
private AuthenticationManager authenticationManager;
35+
36+
@Override
37+
public void configure(final AuthorizationServerSecurityConfigurer security) throws Exception {
38+
security
39+
.tokenKeyAccess("permitAll()")
40+
.checkTokenAccess("isAuthenticated()");
41+
}
42+
43+
@Override
44+
public void configure(final ClientDetailsServiceConfigurer clients) throws Exception {
45+
clients
46+
.inMemory()
47+
.withClient("ABC")
48+
.secret("{noop}sec1")
49+
.autoApprove(true)
50+
.authorizedGrantTypes("authorization_code", "client_credentials", "password", "refresh_token")
51+
.scopes("read", "write")
52+
.redirectUris("http://google.com")
53+
;
54+
}
55+
56+
@Override
57+
public void configure(final AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
58+
endpoints
59+
.tokenStore(new InMemoryTokenStore())
60+
.authenticationManager(authenticationManager);
61+
}
62+
63+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package test.org.springdoc.api.app9;
2+
3+
import org.springframework.web.bind.annotation.GetMapping;
4+
import org.springframework.web.bind.annotation.RestController;
5+
6+
@RestController
7+
public class HelloController {
8+
9+
@GetMapping("/hello")
10+
public String hello() {
11+
return "Hello World!";
12+
}
13+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*
2+
*
3+
* * Copyright 2019-2020 the original author or authors.
4+
* *
5+
* * Licensed under the Apache License, Version 2.0 (the "License");
6+
* * you may not use this file except in compliance with the License.
7+
* * You may obtain a copy of the License at
8+
* *
9+
* * https://www.apache.org/licenses/LICENSE-2.0
10+
* *
11+
* * Unless required by applicable law or agreed to in writing, software
12+
* * distributed under the License is distributed on an "AS IS" BASIS,
13+
* * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* * See the License for the specific language governing permissions and
15+
* * limitations under the License.
16+
*
17+
*/
18+
19+
package test.org.springdoc.api.app9;
20+
21+
import org.junit.jupiter.api.Test;
22+
import org.springdoc.core.Constants;
23+
import test.org.springdoc.api.AbstractSpringDocTest;
24+
25+
import org.springframework.boot.autoconfigure.SpringBootApplication;
26+
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
27+
28+
import static org.hamcrest.Matchers.containsString;
29+
import static org.hamcrest.Matchers.is;
30+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
31+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
32+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
33+
34+
public class SpringDocApp9Test extends AbstractSpringDocTest {
35+
36+
@SpringBootApplication(scanBasePackages = { "test.org.springdoc.api.configuration","test.org.springdoc.api.app9" })
37+
@EnableAuthorizationServer
38+
static class SpringDocTestApp {}
39+
40+
@Test
41+
public void testApp() throws Exception {
42+
mockMvc.perform(get(Constants.DEFAULT_API_DOCS_URL)).andExpect(status().isOk())
43+
.andExpect(jsonPath("$.openapi", is("3.0.1")))
44+
.andExpect(jsonPath("$.paths./oauth/token.get.operationId", containsString("getAccessToken")))
45+
.andExpect(jsonPath("$.paths./oauth/token.post.operationId", containsString("postAccessToken")));
46+
}
47+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package test.org.springdoc.api.app9;
2+
3+
import org.aspectj.lang.ProceedingJoinPoint;
4+
import org.aspectj.lang.annotation.Around;
5+
import org.aspectj.lang.annotation.Aspect;
6+
7+
import org.springframework.stereotype.Component;
8+
9+
@Aspect
10+
@Component
11+
public class TokenEndpointRetryInterceptor {
12+
13+
private static final int MAX_RETRIES = 3;
14+
15+
@Around("execution(* org.springframework.security.oauth2.provider.endpoint.TokenEndpoint.*(..))")
16+
public Object execute (ProceedingJoinPoint aJoinPoint) throws Throwable {
17+
int tts = 1000;
18+
for (int i=1; i<=MAX_RETRIES; i++) {
19+
try {
20+
return aJoinPoint.proceed();
21+
} catch (Exception e) {
22+
Thread.sleep(tts);
23+
tts=tts*2;
24+
}
25+
}
26+
throw new IllegalStateException("Could not execute: " + aJoinPoint.getSignature().getName());
27+
}
28+
29+
}

0 commit comments

Comments
 (0)