@@ -20,7 +20,7 @@ trait GrantHandler {
20
20
*/
21
21
def clientCredentialRequired = true
22
22
23
- def handleRequest [U ](request : AuthorizationRequest , authorizationHandler : AuthorizationHandler [U ])(implicit ctx : ExecutionContext ): Future [GrantHandlerResult [U ]]
23
+ def handleRequest [U ](maybeValidatedClientCred : Option [ ClientCredential ], request : AuthorizationRequest , authorizationHandler : AuthorizationHandler [U ])(implicit ctx : ExecutionContext ): Future [GrantHandlerResult [U ]]
24
24
25
25
/**
26
26
* Returns valid access token.
@@ -53,51 +53,51 @@ trait GrantHandler {
53
53
54
54
class RefreshToken extends GrantHandler {
55
55
56
- override def handleRequest [U ](request : AuthorizationRequest , handler : AuthorizationHandler [U ])(implicit ctx : ExecutionContext ): Future [GrantHandlerResult [U ]] = {
56
+ override def handleRequest [U ](maybeValidatedClientCred : Option [ClientCredential ], request : AuthorizationRequest , handler : AuthorizationHandler [U ])(implicit ctx : ExecutionContext ): Future [GrantHandlerResult [U ]] = {
57
+ val clientId = maybeValidatedClientCred.getOrElse(throw new InvalidRequest (" Client credential is required" )).clientId
57
58
val refreshTokenRequest = RefreshTokenRequest (request)
58
- val clientCredential = refreshTokenRequest.clientCredential.getOrElse(throw new InvalidRequest (" Client credential is required" ))
59
59
val refreshToken = refreshTokenRequest.refreshToken
60
60
61
61
handler.findAuthInfoByRefreshToken(refreshToken).flatMap { authInfoOption =>
62
62
val authInfo = authInfoOption.getOrElse(throw new InvalidGrant (" Authorized information is not found by the refresh token" ))
63
- if (! authInfo.clientId.contains(clientCredential.clientId)) {
64
- throw new InvalidClient
65
- }
66
-
63
+ if (! authInfo.clientId.contains(clientId)) throw new InvalidClient
67
64
handler.refreshAccessToken(authInfo, refreshToken).map(createGrantHandlerResult(authInfo, _))
68
65
}
69
66
}
70
67
}
71
68
72
69
class Password extends GrantHandler {
73
70
74
- override def handleRequest [U ](request : AuthorizationRequest , handler : AuthorizationHandler [U ])(implicit ctx : ExecutionContext ): Future [GrantHandlerResult [U ]] = {
75
- val passwordRequest = PasswordRequest (request)
76
- if (clientCredentialRequired && passwordRequest.clientCredential.isEmpty) {
71
+ override def handleRequest [U ](maybeValidatedClientCred : Option [ClientCredential ], request : AuthorizationRequest , handler : AuthorizationHandler [U ])(implicit ctx : ExecutionContext ): Future [GrantHandlerResult [U ]] = {
72
+ /**
73
+ * Given that client credentials may be optional, if they are required, they must be fully validated before
74
+ * further processing.
75
+ */
76
+ if (clientCredentialRequired && maybeValidatedClientCred.isEmpty) {
77
77
throw new InvalidRequest (" Client credential is required" )
78
- }
79
-
80
- handler.findUser(passwordRequest).flatMap { maybeUser =>
81
- val user = maybeUser.getOrElse(throw new InvalidGrant (" username or password is incorrect" ))
82
- val scope = passwordRequest.scope
83
- val maybeClientId = passwordRequest.clientCredential. map(_.clientId)
84
- val authInfo = AuthInfo (user, maybeClientId, scope, None )
85
-
86
- issueAccessToken(handler, authInfo)
78
+ } else {
79
+ val passwordRequest = PasswordRequest (request)
80
+ handler.findUser(passwordRequest).flatMap { maybeUser =>
81
+ val user = maybeUser.getOrElse(throw new InvalidGrant (" username or password is incorrect" ))
82
+ val scope = passwordRequest.scope
83
+ val authInfo = AuthInfo (user, maybeValidatedClientCred. map(_.clientId), scope, None )
84
+
85
+ issueAccessToken(handler, authInfo)
86
+ }
87
87
}
88
88
}
89
89
}
90
90
91
91
class ClientCredentials extends GrantHandler {
92
92
93
- override def handleRequest [U ](request : AuthorizationRequest , handler : AuthorizationHandler [U ])(implicit ctx : ExecutionContext ): Future [GrantHandlerResult [U ]] = {
93
+ override def handleRequest [U ](maybeValidatedClientCred : Option [ClientCredential ], request : AuthorizationRequest , handler : AuthorizationHandler [U ])(implicit ctx : ExecutionContext ): Future [GrantHandlerResult [U ]] = {
94
+ val clientId = maybeValidatedClientCred.getOrElse(throw new InvalidRequest (" Client credential is required" )).clientId
94
95
val clientCredentialsRequest = ClientCredentialsRequest (request)
95
- val clientCredential = clientCredentialsRequest.clientCredential.getOrElse(throw new InvalidRequest (" Client credential is required" ))
96
96
val scope = clientCredentialsRequest.scope
97
97
98
98
handler.findUser(clientCredentialsRequest).flatMap { optionalUser =>
99
99
val user = optionalUser.getOrElse(throw new InvalidGrant (" client_id or client_secret or scope is incorrect" ))
100
- val authInfo = AuthInfo (user, Some (clientCredential. clientId), scope, None )
100
+ val authInfo = AuthInfo (user, Some (clientId), scope, None )
101
101
102
102
issueAccessToken(handler, authInfo)
103
103
}
@@ -107,10 +107,9 @@ class ClientCredentials extends GrantHandler {
107
107
108
108
class AuthorizationCode extends GrantHandler {
109
109
110
- override def handleRequest [U ](request : AuthorizationRequest , handler : AuthorizationHandler [U ])(implicit ctx : ExecutionContext ): Future [GrantHandlerResult [U ]] = {
110
+ override def handleRequest [U ](maybeValidatedClientCred : Option [ClientCredential ], request : AuthorizationRequest , handler : AuthorizationHandler [U ])(implicit ctx : ExecutionContext ): Future [GrantHandlerResult [U ]] = {
111
+ val clientId = maybeValidatedClientCred.getOrElse(throw new InvalidRequest (" Client credential is required" )).clientId
111
112
val authorizationCodeRequest = AuthorizationCodeRequest (request)
112
- val clientCredential = authorizationCodeRequest.clientCredential.getOrElse(throw new InvalidRequest (" Client credential is required" ))
113
- val clientId = clientCredential.clientId
114
113
val code = authorizationCodeRequest.code
115
114
val redirectUri = authorizationCodeRequest.redirectUri
116
115
@@ -136,14 +135,14 @@ class AuthorizationCode extends GrantHandler {
136
135
137
136
class Implicit extends GrantHandler {
138
137
139
- override def handleRequest [U ](request : AuthorizationRequest , handler : AuthorizationHandler [U ])(implicit ctx : ExecutionContext ): Future [GrantHandlerResult [U ]] = {
138
+ override def handleRequest [U ](maybeValidatedClientCred : Option [ClientCredential ], request : AuthorizationRequest , handler : AuthorizationHandler [U ])(implicit ctx : ExecutionContext ): Future [GrantHandlerResult [U ]] = {
139
+ val clientId = maybeValidatedClientCred.getOrElse(throw new InvalidRequest (" Client credential is required" )).clientId
140
140
val implicitRequest = ImplicitRequest (request)
141
- val clientCredential = implicitRequest.clientCredential.getOrElse(throw new InvalidRequest (" Client credential is required" ))
142
141
143
142
handler.findUser(implicitRequest).flatMap { maybeUser =>
144
143
val user = maybeUser.getOrElse(throw new InvalidGrant (" user cannot be authenticated" ))
145
144
val scope = implicitRequest.scope
146
- val authInfo = AuthInfo (user, Some (clientCredential. clientId), scope, None )
145
+ val authInfo = AuthInfo (user, Some (clientId), scope, None )
147
146
148
147
issueAccessToken(handler, authInfo)
149
148
}
0 commit comments