@@ -141,23 +141,33 @@ public function respondToAccessTokenRequest(
141
141
$ this ->validateCodeChallenge ($ authCodePayload , $ codeVerifier );
142
142
}
143
143
144
- // Issue and persist new access token
145
- $ accessToken = $ this ->issueAccessToken ($ accessTokenTTL , $ client , $ authCodePayload ->user_id , $ scopes );
146
- $ this ->getEmitter ()->emit (new RequestAccessTokenEvent (RequestEvent::ACCESS_TOKEN_ISSUED , $ request , $ accessToken ));
147
- $ responseType ->setAccessToken ($ accessToken );
148
-
149
- // Issue and persist new refresh token if given
150
- $ refreshToken = $ this ->issueRefreshToken ($ accessToken );
144
+ if ($ this ->authCodeRepository ->lockAuthCode ($ authCodePayload ->auth_code_id )) {
145
+ try {
146
+ // Issue and persist new access token
147
+ $ accessToken = $ this ->issueAccessToken ($ accessTokenTTL , $ client , $ authCodePayload ->user_id , $ scopes );
148
+ $ this ->getEmitter ()->emit (new RequestAccessTokenEvent (RequestEvent::ACCESS_TOKEN_ISSUED , $ request , $ accessToken ));
149
+ $ responseType ->setAccessToken ($ accessToken );
150
+
151
+ // Issue and persist new refresh token if given
152
+ $ refreshToken = $ this ->issueRefreshToken ($ accessToken );
153
+
154
+ if ($ refreshToken !== null ) {
155
+ $ this ->getEmitter ()->emit (new RequestRefreshTokenEvent (RequestEvent::REFRESH_TOKEN_ISSUED , $ request , $ refreshToken ));
156
+ $ responseType ->setRefreshToken ($ refreshToken );
157
+ }
151
158
152
- if ($ refreshToken !== null ) {
153
- $ this ->getEmitter ()->emit (new RequestRefreshTokenEvent (RequestEvent::REFRESH_TOKEN_ISSUED , $ request , $ refreshToken ));
154
- $ responseType ->setRefreshToken ($ refreshToken );
159
+ return $ responseType ;
160
+ } catch (Exception $ e ) {
161
+ $ this ->authCodeRepository ->unlockAuthCode ($ authCodePayload ->auth_code_id );
162
+ throw OAuthServerException::serverError (
163
+ 'access_token ' ,
164
+ $ e
165
+ );
166
+ } finally {
167
+ // Revoke used auth code
168
+ $ this ->authCodeRepository ->revokeAuthCode ($ authCodePayload ->auth_code_id );
169
+ }
155
170
}
156
-
157
- // Revoke used auth code
158
- $ this ->authCodeRepository ->revokeAuthCode ($ authCodePayload ->auth_code_id );
159
-
160
- return $ responseType ;
161
171
}
162
172
163
173
private function validateCodeChallenge (object $ authCodePayload , ?string $ codeVerifier ): void
@@ -213,6 +223,10 @@ private function validateAuthorizationCode(
213
223
throw OAuthServerException::invalidGrant ('Authorization code has been revoked ' );
214
224
}
215
225
226
+ if ($ this ->authCodeRepository ->isAuthCodeLocked ($ authCodePayload ->auth_code_id ) === true ) {
227
+ throw OAuthServerException::invalidGrant ('Authorization code has been locked while an access code beeing issued ' );
228
+ }
229
+
216
230
if ($ authCodePayload ->client_id !== $ client ->getIdentifier ()) {
217
231
throw OAuthServerException::invalidRequest ('code ' , 'Authorization code was not issued to this client ' );
218
232
}
0 commit comments