@@ -20,7 +20,7 @@ trait GrantHandler {
2020 */
2121 def clientCredentialRequired = true
2222
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 ]]
2424
2525 /**
2626 * Returns valid access token.
@@ -53,51 +53,51 @@ trait GrantHandler {
5353
5454class RefreshToken extends GrantHandler {
5555
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
5758 val refreshTokenRequest = RefreshTokenRequest (request)
58- val clientCredential = refreshTokenRequest.clientCredential.getOrElse(throw new InvalidRequest (" Client credential is required" ))
5959 val refreshToken = refreshTokenRequest.refreshToken
6060
6161 handler.findAuthInfoByRefreshToken(refreshToken).flatMap { authInfoOption =>
6262 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
6764 handler.refreshAccessToken(authInfo, refreshToken).map(createGrantHandlerResult(authInfo, _))
6865 }
6966 }
7067}
7168
7269class Password extends GrantHandler {
7370
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) {
7777 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+ }
8787 }
8888 }
8989}
9090
9191class ClientCredentials extends GrantHandler {
9292
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
9495 val clientCredentialsRequest = ClientCredentialsRequest (request)
95- val clientCredential = clientCredentialsRequest.clientCredential.getOrElse(throw new InvalidRequest (" Client credential is required" ))
9696 val scope = clientCredentialsRequest.scope
9797
9898 handler.findUser(clientCredentialsRequest).flatMap { optionalUser =>
9999 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 )
101101
102102 issueAccessToken(handler, authInfo)
103103 }
@@ -107,10 +107,9 @@ class ClientCredentials extends GrantHandler {
107107
108108class AuthorizationCode extends GrantHandler {
109109
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
111112 val authorizationCodeRequest = AuthorizationCodeRequest (request)
112- val clientCredential = authorizationCodeRequest.clientCredential.getOrElse(throw new InvalidRequest (" Client credential is required" ))
113- val clientId = clientCredential.clientId
114113 val code = authorizationCodeRequest.code
115114 val redirectUri = authorizationCodeRequest.redirectUri
116115
@@ -136,14 +135,14 @@ class AuthorizationCode extends GrantHandler {
136135
137136class Implicit extends GrantHandler {
138137
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
140140 val implicitRequest = ImplicitRequest (request)
141- val clientCredential = implicitRequest.clientCredential.getOrElse(throw new InvalidRequest (" Client credential is required" ))
142141
143142 handler.findUser(implicitRequest).flatMap { maybeUser =>
144143 val user = maybeUser.getOrElse(throw new InvalidGrant (" user cannot be authenticated" ))
145144 val scope = implicitRequest.scope
146- val authInfo = AuthInfo (user, Some (clientCredential. clientId), scope, None )
145+ val authInfo = AuthInfo (user, Some (clientId), scope, None )
147146
148147 issueAccessToken(handler, authInfo)
149148 }
0 commit comments