Skip to content

Commit 55a9341

Browse files
committed
Merge remote-tracking branch 'origin/develop' into develop
2 parents 4562e72 + 7a9fad5 commit 55a9341

File tree

16 files changed

+127
-41
lines changed

16 files changed

+127
-41
lines changed

oauth2-server-client-inmemory/src/main/java/nl/myndocs/oauth2/client/inmemory/ClientConfiguration.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@ data class ClientConfiguration(
55
var clientSecret: String? = null,
66
var scopes: Set<String> = setOf(),
77
var redirectUris: Set<String> = setOf(),
8-
var oauthFlows: Set<String> = setOf()
8+
var authorizedGrantTypes: Set<String> = setOf()
99
)

oauth2-server-client-inmemory/src/main/java/nl/myndocs/oauth2/client/inmemory/InMemoryClient.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class InMemoryClient : ClientService {
1616

1717
override fun clientOf(clientId: String): Client? {
1818
return clients.filter { it.clientId == clientId }
19-
.map { client -> nl.myndocs.oauth2.client.Client(client.clientId!!, client.scopes, client.redirectUris) }
19+
.map { client -> nl.myndocs.oauth2.client.Client(client.clientId!!, client.scopes, client.redirectUris, client.authorizedGrantTypes) }
2020
.firstOrNull()
2121
}
2222

oauth2-server-core/src/main/java/nl/myndocs/oauth2/Oauth2TokenService.kt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package nl.myndocs.oauth2
22

33
import nl.myndocs.oauth2.authenticator.Authenticator
44
import nl.myndocs.oauth2.authenticator.IdentityScopeVerifier
5+
import nl.myndocs.oauth2.client.AuthorizedGrantType
56
import nl.myndocs.oauth2.client.Client
67
import nl.myndocs.oauth2.client.ClientService
78
import nl.myndocs.oauth2.exception.*
@@ -46,6 +47,12 @@ class Oauth2TokenService(
4647
val requestedClient = clientService.clientOf(
4748
passwordGrantRequest.clientId!!
4849
)!!
50+
51+
val authorizedGrantType = AuthorizedGrantType.PASSWORD
52+
if (!requestedClient.authorizedGrantTypes.contains(authorizedGrantType)) {
53+
throw InvalidGrantException("Authorize not allowed: '$authorizedGrantType'")
54+
}
55+
4956
val requestedIdentity = identityService.identityOf(
5057
requestedClient, passwordGrantRequest.username
5158
)
@@ -127,6 +134,13 @@ class Oauth2TokenService(
127134
throw InvalidGrantException()
128135
}
129136

137+
val client = clientService.clientOf(refreshToken.clientId)!!
138+
139+
val authorizedGrantType = AuthorizedGrantType.REFRESH_TOKEN
140+
if (!client.authorizedGrantTypes.contains(authorizedGrantType)) {
141+
throw InvalidGrantException("Authorize not allowed: '$authorizedGrantType'")
142+
}
143+
130144
val accessToken = accessTokenConverter.convertToToken(
131145
refreshToken.username,
132146
refreshToken.clientId,
@@ -165,6 +179,11 @@ class Oauth2TokenService(
165179
throw InvalidGrantException("invalid 'redirect_uri'")
166180
}
167181

182+
val authorizedGrantType = AuthorizedGrantType.AUTHORIZATION_CODE
183+
if (!clientOf.authorizedGrantTypes.contains(authorizedGrantType)) {
184+
throw InvalidGrantException("Authorize not allowed: '$authorizedGrantType'")
185+
}
186+
168187
val identityOf = identityService.identityOf(clientOf, redirect.username) ?: throw InvalidIdentityException()
169188

170189
var validIdentity = authenticator?.validCredentials(clientOf, identityOf, redirect.password)
@@ -220,6 +239,11 @@ class Oauth2TokenService(
220239
throw InvalidGrantException("invalid 'redirect_uri'")
221240
}
222241

242+
val authorizedGrantType = AuthorizedGrantType.IMPLICIT
243+
if (!clientOf.authorizedGrantTypes.contains(authorizedGrantType)) {
244+
throw InvalidGrantException("Authorize not allowed: '$authorizedGrantType'")
245+
}
246+
223247
val identityOf = identityService.identityOf(clientOf, redirect.username) ?: throw InvalidIdentityException()
224248

225249
var validIdentity = authenticator?.validCredentials(clientOf, identityOf, redirect.password)
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package nl.myndocs.oauth2.client
2+
3+
object AuthorizedGrantType {
4+
const val IMPLICIT = "implicit"
5+
const val REFRESH_TOKEN = "refresh_token"
6+
const val PASSWORD = "password"
7+
const val AUTHORIZATION_CODE = "authorization_code"
8+
}

oauth2-server-core/src/main/java/nl/myndocs/oauth2/client/Client.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@ package nl.myndocs.oauth2.client
33
data class Client(
44
val clientId: String,
55
val clientScopes: Set<String>,
6-
val redirectUris: Set<String>
6+
val redirectUris: Set<String>,
7+
val authorizedGrantTypes: Set<String>
78
)

oauth2-server-core/src/test/java/nl/myndocs/oauth2/AuthorizationCodeGrantTokenServiceTest.kt

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import io.mockk.impl.annotations.InjectMockKs
55
import io.mockk.impl.annotations.MockK
66
import io.mockk.impl.annotations.RelaxedMockK
77
import io.mockk.junit5.MockKExtension
8+
import nl.myndocs.oauth2.client.AuthorizedGrantType
89
import nl.myndocs.oauth2.client.Client
910
import nl.myndocs.oauth2.client.ClientService
1011
import nl.myndocs.oauth2.exception.InvalidClientException
@@ -60,7 +61,7 @@ internal class AuthorizationCodeGrantTokenServiceTest {
6061
fun validAuthorizationCodeGrant() {
6162
val requestScopes = setOf("scope1")
6263

63-
val client = Client(clientId, setOf("scope1", "scope2"), setOf())
64+
val client = Client(clientId, setOf("scope1", "scope2"), setOf(), setOf(AuthorizedGrantType.AUTHORIZATION_CODE))
6465
val identity = Identity(username)
6566
val codeToken = CodeToken(code, Instant.now(), username, clientId, redirectUri, requestScopes)
6667

@@ -88,7 +89,7 @@ internal class AuthorizationCodeGrantTokenServiceTest {
8889

8990
@Test
9091
fun invalidClientException() {
91-
val client = Client(clientId, setOf(), setOf())
92+
val client = Client(clientId, setOf(), setOf(), setOf(AuthorizedGrantType.AUTHORIZATION_CODE))
9293
every { clientService.clientOf(clientId) } returns client
9394
every { clientService.validClient(client, clientSecret) } returns false
9495

@@ -106,7 +107,7 @@ internal class AuthorizationCodeGrantTokenServiceTest {
106107
redirectUri
107108
)
108109

109-
val client = Client(clientId, setOf(), setOf())
110+
val client = Client(clientId, setOf(), setOf(), setOf(AuthorizedGrantType.AUTHORIZATION_CODE))
110111
every { clientService.clientOf(clientId) } returns client
111112
every { clientService.validClient(client, clientSecret) } returns true
112113

@@ -124,7 +125,7 @@ internal class AuthorizationCodeGrantTokenServiceTest {
124125
null
125126
)
126127

127-
val client = Client(clientId, setOf(), setOf())
128+
val client = Client(clientId, setOf(), setOf(), setOf(AuthorizedGrantType.AUTHORIZATION_CODE))
128129
every { clientService.clientOf(clientId) } returns client
129130
every { clientService.validClient(client, clientSecret) } returns true
130131

@@ -138,7 +139,7 @@ internal class AuthorizationCodeGrantTokenServiceTest {
138139
val wrongRedirectUri = ""
139140
val requestScopes = setOf("scope1")
140141

141-
val client = Client(clientId, setOf("scope1", "scope2"), setOf())
142+
val client = Client(clientId, setOf("scope1", "scope2"), setOf(), setOf(AuthorizedGrantType.AUTHORIZATION_CODE))
142143
val codeToken = CodeToken(code, Instant.now(), username, clientId, wrongRedirectUri, requestScopes)
143144

144145
val refreshToken = RefreshToken("test", Instant.now(), username, clientId, requestScopes)
@@ -157,7 +158,7 @@ internal class AuthorizationCodeGrantTokenServiceTest {
157158

158159
@Test
159160
fun invalidCodeException() {
160-
val client = Client(clientId, setOf("scope1", "scope2"), setOf())
161+
val client = Client(clientId, setOf("scope1", "scope2"), setOf(), setOf(AuthorizedGrantType.AUTHORIZATION_CODE))
161162

162163
every { clientService.clientOf(clientId) } returns client
163164
every { clientService.validClient(client, clientSecret) } returns true

oauth2-server-core/src/test/java/nl/myndocs/oauth2/PasswordGrantTokenServiceTest.kt

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import io.mockk.impl.annotations.MockK
66
import io.mockk.impl.annotations.RelaxedMockK
77
import io.mockk.junit5.MockKExtension
88
import io.mockk.verify
9+
import nl.myndocs.oauth2.client.AuthorizedGrantType
910
import nl.myndocs.oauth2.client.Client
1011
import nl.myndocs.oauth2.client.ClientService
1112
import nl.myndocs.oauth2.exception.InvalidClientException
@@ -61,7 +62,7 @@ internal class PasswordGrantTokenServiceTest {
6162

6263
@Test
6364
fun validPasswordGrant() {
64-
val client = Client(clientId, setOf("scope1", "scope2"), setOf())
65+
val client = Client(clientId, setOf("scope1", "scope2"), setOf(), setOf(AuthorizedGrantType.PASSWORD))
6566
val identity = Identity(username)
6667
val requestScopes = setOf("scope1")
6768
val refreshToken = RefreshToken("test", Instant.now(), username, clientId, requestScopes)
@@ -91,7 +92,7 @@ internal class PasswordGrantTokenServiceTest {
9192

9293
@Test
9394
fun invalidClientException() {
94-
val client = Client(clientId, setOf(), setOf())
95+
val client = Client(clientId, setOf(), setOf(), setOf(AuthorizedGrantType.PASSWORD))
9596
every { clientService.clientOf(clientId) } returns client
9697
every { clientService.validClient(client, clientSecret) } returns false
9798

@@ -110,7 +111,7 @@ internal class PasswordGrantTokenServiceTest {
110111
scope
111112
)
112113

113-
val client = Client(clientId, setOf(), setOf())
114+
val client = Client(clientId, setOf(), setOf(), setOf(AuthorizedGrantType.PASSWORD))
114115
every { clientService.clientOf(clientId) } returns client
115116
every { clientService.validClient(client, clientSecret) } returns true
116117

@@ -129,7 +130,7 @@ internal class PasswordGrantTokenServiceTest {
129130
scope
130131
)
131132

132-
val client = Client(clientId, setOf(), setOf())
133+
val client = Client(clientId, setOf(), setOf(), setOf(AuthorizedGrantType.PASSWORD))
133134
every { clientService.clientOf(clientId) } returns client
134135
every { clientService.validClient(client, clientSecret) } returns true
135136

@@ -140,7 +141,7 @@ internal class PasswordGrantTokenServiceTest {
140141

141142
@Test
142143
fun invalidIdentityException() {
143-
val client = Client(clientId, setOf(), setOf())
144+
val client = Client(clientId, setOf(), setOf(), setOf(AuthorizedGrantType.PASSWORD))
144145
val identity = Identity(username)
145146

146147
every { clientService.clientOf(clientId) } returns client
@@ -155,7 +156,7 @@ internal class PasswordGrantTokenServiceTest {
155156

156157
@Test
157158
fun invalidIdentityScopeException() {
158-
val client = Client(clientId, setOf("scope1", "scope2"), setOf())
159+
val client = Client(clientId, setOf("scope1", "scope2"), setOf(), setOf(AuthorizedGrantType.PASSWORD))
159160
val identity = Identity(username)
160161

161162
every { clientService.clientOf(clientId) } returns client
@@ -171,7 +172,7 @@ internal class PasswordGrantTokenServiceTest {
171172

172173
@Test
173174
fun invalidRequestClientScopeException() {
174-
val client = Client(clientId, setOf("scope3"), setOf())
175+
val client = Client(clientId, setOf("scope3"), setOf(), setOf(AuthorizedGrantType.PASSWORD))
175176
val identity = Identity(username)
176177

177178
every { clientService.clientOf(clientId) } returns client
@@ -195,7 +196,7 @@ internal class PasswordGrantTokenServiceTest {
195196
null
196197
)
197198

198-
val client = Client(clientId, setOf("scope1", "scope2"), setOf())
199+
val client = Client(clientId, setOf("scope1", "scope2"), setOf(), setOf(AuthorizedGrantType.PASSWORD))
199200
val identity = Identity(username)
200201
val requestScopes = setOf("scope1", "scope2")
201202
val refreshToken = RefreshToken("test", Instant.now(), username, clientId, requestScopes)

oauth2-server-core/src/test/java/nl/myndocs/oauth2/RefreshTokenGrantTokenServiceTest.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import io.mockk.impl.annotations.MockK
66
import io.mockk.impl.annotations.RelaxedMockK
77
import io.mockk.junit5.MockKExtension
88
import io.mockk.verify
9+
import nl.myndocs.oauth2.client.AuthorizedGrantType
910
import nl.myndocs.oauth2.client.Client
1011
import nl.myndocs.oauth2.client.ClientService
1112
import nl.myndocs.oauth2.exception.InvalidClientException
@@ -58,7 +59,7 @@ internal class RefreshTokenGrantTokenServiceTest {
5859

5960
@Test
6061
fun validRefreshToken() {
61-
val client = Client(clientId, setOf("scope1", "scope2"), setOf())
62+
val client = Client(clientId, setOf("scope1", "scope2"), setOf(), setOf(AuthorizedGrantType.REFRESH_TOKEN))
6263
val token = RefreshToken("test", Instant.now(), username, clientId, scopes)
6364
val newRefreshToken = RefreshToken("test", Instant.now(), username, clientId, scopes)
6465
val accessToken = AccessToken("test", "bearer", Instant.now(), username, clientId, scopes, newRefreshToken)
@@ -79,7 +80,7 @@ internal class RefreshTokenGrantTokenServiceTest {
7980

8081
@Test
8182
fun missingRefreshToken() {
82-
val client = Client(clientId, setOf("scope1", "scope2"), setOf())
83+
val client = Client(clientId, setOf("scope1", "scope2"), setOf(), setOf(AuthorizedGrantType.REFRESH_TOKEN))
8384

8485
every { clientService.clientOf(clientId) } returns client
8586
every { clientService.validClient(client, clientSecret) } returns true
@@ -106,7 +107,7 @@ internal class RefreshTokenGrantTokenServiceTest {
106107

107108
@Test
108109
fun invalidClientException() {
109-
val client = Client(clientId, setOf(), setOf())
110+
val client = Client(clientId, setOf(), setOf(), setOf(AuthorizedGrantType.REFRESH_TOKEN))
110111
every { clientService.clientOf(clientId) } returns client
111112
every { clientService.validClient(client, clientSecret) } returns false
112113

@@ -117,7 +118,7 @@ internal class RefreshTokenGrantTokenServiceTest {
117118

118119
@Test
119120
fun storedClientDoesNotMatchRequestedException() {
120-
val client = Client(clientId, setOf("scope1", "scope2"), setOf())
121+
val client = Client(clientId, setOf("scope1", "scope2"), setOf(), setOf(AuthorizedGrantType.REFRESH_TOKEN))
121122
val token = RefreshToken("test", Instant.now(), username, "wrong-client", scopes)
122123

123124
every { clientService.clientOf(clientId) } returns client

oauth2-server-json/pom.xml

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<artifactId>kotlin-oauth2-server</artifactId>
7+
<groupId>nl.myndocs</groupId>
8+
<version>0.1.1</version>
9+
</parent>
10+
<modelVersion>4.0.0</modelVersion>
11+
12+
<artifactId>oauth2-server-json</artifactId>
13+
14+
<dependencies>
15+
<dependency>
16+
<groupId>com.google.code.gson</groupId>
17+
<artifactId>gson</artifactId>
18+
<version>2.8.5</version>
19+
</dependency>
20+
</dependencies>
21+
22+
<build>
23+
<plugins>
24+
<plugin>
25+
<groupId>org.apache.maven.plugins</groupId>
26+
<artifactId>maven-shade-plugin</artifactId>
27+
<version>3.1.1</version>
28+
<configuration>
29+
<createSourcesJar>true</createSourcesJar>
30+
<artifactSet>
31+
<includes>
32+
<include>com.google.code.gson:*</include>
33+
</includes>
34+
</artifactSet>
35+
<relocations>
36+
<relocation>
37+
<pattern>com.google.gson</pattern>
38+
<shadedPattern>nl.myndocs.oauth2.shaded.com.google.gson</shadedPattern>
39+
</relocation>
40+
</relocations>
41+
<shadedArtifactAttached>true</shadedArtifactAttached>
42+
<transformers>
43+
<transformer
44+
implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
45+
</transformers>
46+
</configuration>
47+
<executions>
48+
<execution>
49+
<phase>package</phase>
50+
<goals>
51+
<goal>shade</goal>
52+
</goals>
53+
</execution>
54+
</executions>
55+
</plugin>
56+
</plugins>
57+
</build>
58+
</project>
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package nl.myndocs.oauth2.sparkjava.json
1+
package nl.myndocs.oauth2.json
22

33
import com.google.gson.Gson
44

0 commit comments

Comments
 (0)