11package nl.myndocs.oauth2
22
33import nl.myndocs.oauth2.authenticator.Authorizer
4- import nl.myndocs.oauth2.client.AuthorizedGrantType.AUTHORIZATION_CODE
5- import nl.myndocs.oauth2.client.AuthorizedGrantType.CLIENT_CREDENTIALS
6- import nl.myndocs.oauth2.client.AuthorizedGrantType.PASSWORD
7- import nl.myndocs.oauth2.client.AuthorizedGrantType.REFRESH_TOKEN
84import nl.myndocs.oauth2.exception.*
5+ import nl.myndocs.oauth2.grant.Granter
6+ import nl.myndocs.oauth2.grant.GrantingCall
97import nl.myndocs.oauth2.identity.TokenInfo
10- import nl.myndocs.oauth2.request.*
11- import nl.myndocs.oauth2.token.toMap
8+ import nl.myndocs.oauth2.request.CallContext
9+ import nl.myndocs.oauth2.request.RedirectAuthorizationCodeRequest
10+ import nl.myndocs.oauth2.request.RedirectTokenRequest
11+ import nl.myndocs.oauth2.request.headerCaseInsensitive
1212
1313class CallRouter (
1414 private val tokenService : TokenService ,
1515 val tokenEndpoint : String ,
1616 val authorizeEndpoint : String ,
1717 val tokenInfoEndpoint : String ,
18- private val tokenInfoCallback : (TokenInfo ) -> Map <String , Any ?>
18+ private val tokenInfoCallback : (TokenInfo ) -> Map <String , Any ?>,
19+ private val granters : List <GrantingCall .() - > Granter >
1920) {
2021 companion object {
2122 const val METHOD_POST = " post"
@@ -42,76 +43,36 @@ class CallRouter(
4243 }
4344
4445 try {
45- val allowedGrantTypes = setOf (PASSWORD , AUTHORIZATION_CODE , REFRESH_TOKEN , CLIENT_CREDENTIALS )
4646 val grantType = callContext.formParameters[" grant_type" ]
4747 ? : throw InvalidRequestException (" 'grant_type' not given" )
4848
49+ val grantingCall = object : GrantingCall {
50+ override val callContext: CallContext
51+ get() = callContext
52+
53+ override val tokenService = this @CallRouter.tokenService
54+ }
55+
56+ val granterMap = granters
57+ .map {
58+ val granter = grantingCall.it()
59+ granter.grantType to granter
60+ }
61+ .toMap()
62+
63+ val allowedGrantTypes = granterMap.keys
64+
4965 if (! allowedGrantTypes.contains(grantType)) {
5066 throw InvalidGrantException (" 'grant_type' with value '$grantType ' not allowed" )
5167 }
5268
53- when (grantType) {
54- " password" -> routePasswordGrant(callContext, tokenService)
55- " authorization_code" -> routeAuthorizationCodeGrant(callContext, tokenService)
56- " refresh_token" -> routeRefreshTokenGrant(callContext, tokenService)
57- " client_credentials" -> routeClientCredentialsGrant(callContext, tokenService)
58- }
69+ granterMap[grantType]!! .callback.invoke()
5970 } catch (oauthException: OauthException ) {
6071 callContext.respondStatus(STATUS_BAD_REQUEST )
6172 callContext.respondJson(oauthException.toMap())
6273 }
6374 }
6475
65- fun routePasswordGrant (callContext : CallContext , tokenService : TokenService ) {
66- val tokenResponse = tokenService.authorize(
67- PasswordGrantRequest (
68- callContext.formParameters[" client_id" ],
69- callContext.formParameters[" client_secret" ],
70- callContext.formParameters[" username" ],
71- callContext.formParameters[" password" ],
72- callContext.formParameters[" scope" ]
73- )
74- )
75-
76- callContext.respondJson(tokenResponse.toMap())
77- }
78-
79- fun routeClientCredentialsGrant (callContext : CallContext , tokenService : TokenService ) {
80- val tokenResponse = tokenService.authorize(ClientCredentialsRequest (
81- callContext.formParameters[" client_id" ],
82- callContext.formParameters[" client_secret" ],
83- callContext.formParameters[" scope" ]
84- ))
85-
86- callContext.respondJson(tokenResponse.toMap())
87- }
88-
89- fun routeRefreshTokenGrant (callContext : CallContext , tokenService : TokenService ) {
90- val accessToken = tokenService.refresh(
91- RefreshTokenRequest (
92- callContext.formParameters[" client_id" ],
93- callContext.formParameters[" client_secret" ],
94- callContext.formParameters[" refresh_token" ]
95- )
96- )
97-
98- callContext.respondJson(accessToken.toMap())
99- }
100-
101- fun routeAuthorizationCodeGrant (callContext : CallContext , tokenService : TokenService ) {
102- val accessToken = tokenService.authorize(
103- AuthorizationCodeRequest (
104- callContext.formParameters[" client_id" ],
105- callContext.formParameters[" client_secret" ],
106- callContext.formParameters[" code" ],
107- callContext.formParameters[" redirect_uri" ]
108- )
109- )
110-
111- callContext.respondJson(accessToken.toMap())
112- }
113-
114-
11576 fun routeAuthorizationCodeRedirect (
11677 callContext : CallContext ,
11778 tokenService : TokenService ,
0 commit comments