Skip to content

Commit fa28352

Browse files
refacto redirectionToAuthorizationUrl with one call
1 parent 6299dc4 commit fa28352

3 files changed

Lines changed: 100 additions & 139 deletions

File tree

src/Controllers/LoginController.php

Lines changed: 35 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -119,51 +119,42 @@ public function logout(Request $request, Response $response): Response
119119
return $response->withHeader('Location', $url)->withStatus(302);
120120
}
121121

122-
private function redirectionToAuthorizationUrl(Response $response, $organizationSlug): Response
123-
{
124-
$globalTokens = $this->apiWrapper->getAccessTokensAndRefreshIfNecessary(null);
125-
126-
// Si le token global est null ou expiré, on tente de le régénérer
127-
if ($globalTokens === null) {
128-
$this->logger->warning('Global access token is null or expired. Attempting to generate new one.');
122+
private function redirectionToAuthorizationUrl(Response $response, $organizationSlug): Response
123+
{
124+
$globalTokens = $this->apiWrapper->getAccessTokensAndRefreshIfNecessary(null);
129125

130-
try {
131-
// Tenter de générer un nouveau token global
132-
$globalTokens = $this->apiWrapper->getAccessTokensAndRefreshIfNecessary(null);
126+
// Si le token global est null ou expiré, on tente de le régénérer
127+
if ($globalTokens === null) {
128+
$this->logger->warning('Global access token is null or expired. Attempting to generate new one.');
133129

134-
if ($globalTokens === null) {
135-
$this->logger->error('Failed to generate global access token.');
136-
throw new Exception('Impossible de générer un token d\'accès global.');
130+
try {
131+
// Tenter de générer un nouveau token global
132+
$globalTokens = $this->apiWrapper->getAccessTokensAndRefreshIfNecessary(null);
133+
134+
if ($globalTokens === null) {
135+
$this->logger->error('Failed to generate global access token.');
136+
throw new Exception('Impossible de générer un token d\'accès global.');
137+
}
138+
} catch (Exception $e) {
139+
$this->logger->error('Error generating global token: ' . $e->getMessage());
140+
throw $e;
137141
}
138-
} catch (Exception $e) {
139-
$this->logger->error('Error generating global token: ' . $e->getMessage());
140-
throw $e;
141142
}
142-
}
143-
144-
// Configuration du domaine client avec le token global
145-
try {
146-
$this->apiWrapper->setClientDomain($globalTokens->access_token);
147-
} catch (Exception $e) {
148-
$this->logger->error('Error setting client domain: ' . $e->getMessage());
149-
// On continue même si setClientDomain échoue, car ce n'est pas bloquant pour l'authentification
150-
}
151-
152-
// Vérifier si l'organisation a déjà un token valide
153-
if ($organizationSlug !== null) {
154-
$orgTokens = $this->apiWrapper->getAccessTokensAndRefreshIfNecessary($organizationSlug);
155143

156-
// Si le token de l'organisation est null, on force une nouvelle authentification OAuth
157-
if ($orgTokens === null) {
158-
$this->logger->info('Organization token expired or invalid for: ' . $organizationSlug . '. Generating new authorization URL.');
144+
// Configuration du domaine client avec le token global
145+
try {
146+
$this->apiWrapper->setClientDomain($globalTokens->access_token);
147+
} catch (Exception $e) {
148+
$this->logger->error('Error setting client domain: ' . $e->getMessage());
159149
}
160-
}
150+
161151

162-
// Génération de l'URL d'autorisation (nouvelle authentification OAuth)
163-
$authorizationUrl = $this->apiWrapper->generateAuthorizationUrl($organizationSlug);
152+
// Génération de l'URL d'autorisation (nouvelle authentification OAuth)
153+
$authorizationUrl = $this->apiWrapper->generateAuthorizationUrl($organizationSlug);
164154

165-
return $response->withHeader('Location', $authorizationUrl)->withStatus(302);
166-
}
155+
return $response->withHeader('Location', $authorizationUrl)->withStatus(302);
156+
}
157+
167158
public function redirectAuthPage(Request $request, Response $response): Response
168159
{
169160
$organizationSlug = $request->getQueryParams()['organizationSlug'];
@@ -179,13 +170,13 @@ public function redirectAuthPage(Request $request, Response $response): Response
179170
$response->getBody()->write('Nous possédons déjà un token pour le compte ' . $organizationSlug . ' et nous l\'avons rafraichi, vous pouvez fermer cette page.');
180171

181172
} catch (Exception $e) {
182-
// TODO => Afficher too many request
183-
// var_dump($e);die();
173+
184174
return $this->redirectionToAuthorizationUrl($response, $organizationSlug);
185-
}
186-
} else {
187-
return $this->redirectionToAuthorizationUrl($response, $organizationSlug);
188-
}
175+
}
176+
}
177+
else {
178+
return $this->redirectionToAuthorizationUrl($response, $organizationSlug);
179+
}
189180

190181
return $response;
191182
}
@@ -234,8 +225,7 @@ public function validateAuthPage(Request $request, Response $response): Response
234225
],
235226
]
236227
]);
237-
} else
238-
{
228+
} else {
239229
$this->accessTokenRepository->update($token);
240230
}
241231

src/Repositories/AccessTokenRepository.php

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -33,22 +33,7 @@ function selectBySlug($organization_slug): ?AccessToken
3333

3434
return $token ?: null;
3535
}
36-
public function deleteBySlug($organization_slug): void
37-
{
38-
if (is_null($organization_slug)) {
39-
$query = "DELETE FROM `{$this->prefix}access_token_partner_organization`
40-
WHERE organization_slug IS NULL";
41-
$stmt = $this->pdo->prepare($query);
42-
$stmt->execute();
43-
} else {
44-
$query = "DELETE FROM `{$this->prefix}access_token_partner_organization`
45-
WHERE organization_slug = :organization_slug";
46-
$stmt = $this->pdo->prepare($query);
47-
$stmt->execute([
48-
':organization_slug' => $organization_slug
49-
]);
50-
}
51-
}
36+
5237
function getAccessTokensToRefresh(): array
5338
{
5439
$stmt = $this->pdo->prepare('SELECT *

src/Services/ApiWrapper.php

Lines changed: 64 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -85,103 +85,89 @@ private function generateGlobalAccessToken(): AccessToken
8585
return $obj;
8686
}
8787

88-
private function refreshToken($refreshToken, $organization_slug): ?AccessToken
89-
{
90-
try {
91-
$response = $this->client->request('POST', $this->apiAuthUrl, [
92-
'form_params' => [
93-
'grant_type' => 'refresh_token',
94-
'refresh_token' => $refreshToken,
95-
],
96-
'headers' => [
97-
'content-type' => 'application/x-www-form-urlencoded',
98-
'accept' => 'application/json',
99-
],
100-
]);
101-
} catch (RequestException $e) {
102-
$this->apiLogger->error('Erreur lors du refresh token pour ' . $organization_slug . ': ' . $e->getMessage());
103-
if ($e->hasResponse()) {
104-
$statusCode = $e->getResponse()->getStatusCode();
105-
$this->apiLogger->error('Response status: ' . $statusCode);
106-
$this->apiLogger->error('Response body: ' . $e->getResponse()->getBody());
107-
108-
// Si le refresh token est invalide (404, 400, 401), on retourne null
109-
// pour forcer une nouvelle authentification
110-
if (in_array($statusCode, [400, 401, 404])) {
111-
$this->apiLogger->warning('Refresh token invalide ou expiré pour ' . $organization_slug . '. Nouvelle authentification nécessaire.');
112-
113-
// Suppression du token invalide de la base de données
114-
$this->accessTokenRepository->deleteBySlug($organization_slug);
115-
116-
return null;
88+
private function refreshToken($refreshToken, $organization_slug): ?AccessToken
89+
{
90+
try {
91+
$response = $this->client->request('POST', $this->apiAuthUrl, [
92+
'form_params' => [
93+
'grant_type' => 'refresh_token',
94+
'refresh_token' => $refreshToken,
95+
],
96+
'headers' => [
97+
'content-type' => 'application/x-www-form-urlencoded',
98+
'accept' => 'application/json',
99+
],
100+
]);
101+
} catch (RequestException $e) {
102+
$this->apiLogger->error('Erreur lors du refresh token pour ' . $organization_slug . ': ' . $e->getMessage());
103+
if ($e->hasResponse()) {
104+
$statusCode = $e->getResponse()->getStatusCode();
105+
$this->apiLogger->error('Response status: ' . $statusCode);
106+
$this->apiLogger->error('Response body: ' . $e->getResponse()->getBody());
117107
}
108+
throw new Exception("Erreur lors du rafraîchissement du token : " . $e->getMessage(), 0, $e);
109+
} catch (GuzzleException $e) {
110+
$this->apiLogger->error('Erreur Guzzle lors du refresh token pour ' . $organization_slug . ': ' . $e->getMessage());
111+
throw new Exception("Erreur de connexion à l'API : " . $e->getMessage(), 0, $e);
118112
}
119-
throw new Exception("Erreur lors du rafraîchissement du token : " . $e->getMessage(), 0, $e);
120-
} catch (GuzzleException $e) {
121-
$this->apiLogger->error('Erreur Guzzle lors du refresh token pour ' . $organization_slug . ': ' . $e->getMessage());
122-
throw new Exception("Erreur de connexion à l'API : " . $e->getMessage(), 0, $e);
123-
}
124-
125-
$responseData = json_decode($response->getBody(), true);
126113

127-
if (json_last_error() !== JSON_ERROR_NONE) {
128-
throw new Exception("Erreur de décodage JSON : " . json_last_error_msg());
129-
}
114+
$responseData = json_decode($response->getBody(), true);
130115

131-
if (!isset($responseData['access_token']) || !isset($responseData['refresh_token'])) {
132-
throw new Exception("Erreur : Les tokens ne sont pas présents dans la réponse.");
133-
}
116+
if (json_last_error() !== JSON_ERROR_NONE) {
117+
throw new Exception("Erreur de décodage JSON : " . json_last_error_msg());
118+
}
134119

135-
$accessTokenExpiresAt = (new DateTime())->add(new DateInterval('PT28M'));
136-
$refreshTokenExpiresAt = (new DateTime())->add(new DateInterval('P28D'));
120+
if (!isset($responseData['access_token']) || !isset($responseData['refresh_token'])) {
121+
throw new Exception("Erreur : Les tokens ne sont pas présents dans la réponse.");
122+
}
137123

138-
$obj = new AccessToken();
139-
$obj->access_token = $responseData['access_token'];
140-
$obj->refresh_token = $responseData['refresh_token'];
141-
$obj->organization_slug = $organization_slug;
142-
$obj->access_token_expires_at = $accessTokenExpiresAt;
143-
$obj->refresh_token_expires_at = $refreshTokenExpiresAt;
124+
$accessTokenExpiresAt = (new DateTime())->add(new DateInterval('PT28M'));
125+
$refreshTokenExpiresAt = (new DateTime())->add(new DateInterval('P28D'));
144126

145-
return $this->accessTokenRepository->update($obj);
146-
}
127+
$obj = new AccessToken();
128+
$obj->access_token = $responseData['access_token'];
129+
$obj->refresh_token = $responseData['refresh_token'];
130+
$obj->organization_slug = $organization_slug;
131+
$obj->access_token_expires_at = $accessTokenExpiresAt;
132+
$obj->refresh_token_expires_at = $refreshTokenExpiresAt;
147133

134+
return $this->accessTokenRepository->update(
135+
$obj
136+
);
137+
}
148138

149-
public function getAccessTokensAndRefreshIfNecessary($organization_slug): ?AccessToken
150-
{
151-
$tokenData = $this->accessTokenRepository->selectBySlug($organization_slug);
139+
public function getAccessTokensAndRefreshIfNecessary($organization_slug): ?AccessToken
140+
{
141+
$tokenData = $this->accessTokenRepository->selectBySlug($organization_slug);
152142

153-
if ($tokenData == null) {
154-
if ($organization_slug == null) {
155-
$tokenData = $this->generateGlobalAccessToken();
156-
return $tokenData;
143+
if ($tokenData == null) {
144+
if ($organization_slug == null) {
145+
$tokenData = $this->generateGlobalAccessToken();
146+
return $tokenData;
147+
} else {
148+
return null;
149+
}
157150
} else {
158-
return null;
159-
}
160-
} else {
161-
$expiry = new DateTime($tokenData->access_token_expires_at);
162-
$now = new DateTime();
151+
152+
$expiry = new DateTime($tokenData->access_token_expires_at);
153+
$now = new DateTime();
163154

164-
if ($expiry < $now) {
165-
$this->apiLogger->info('Current time: ' . $now->format('Y-m-d H:i:s'));
166-
$this->apiLogger->info('Access token expiry time: ' . $expiry->format('Y-m-d H:i:s'));
167-
$this->apiLogger->warning('Access token expired for organization_slug: ' . $organization_slug);
155+
if ($expiry < $now) {
168156

169-
$tokenData = $this->refreshToken($tokenData->refresh_token, $organization_slug);
157+
$this->apiLogger->info('Current time: ' . $now->format('Y-m-d H:i:s'));
158+
$this->apiLogger->info('Access token expiry time: ' . $expiry->format('Y-m-d H:i:s'));
159+
$this->apiLogger->error('Access token expired for organization_slug: ' . $organization_slug);
170160

171-
if ($tokenData === null) {
172-
// Le refresh token a échoué, on retourne null pour forcer une nouvelle authentification
173-
$this->apiLogger->warning('Refresh token failed. Returning null to trigger re-authentication.');
174-
return null;
175-
}
161+
$tokenData = $this->refreshToken($tokenData->refresh_token, $organization_slug);
176162

177-
$this->apiLogger->info('Token data after refresh: ' . json_encode($tokenData));
163+
$this->apiLogger->info('Token data refreshed for organization_slug: ' . $organization_slug);
164+
165+
return $tokenData;
166+
}
178167

179168
return $tokenData;
180169
}
181-
182-
return $tokenData;
183170
}
184-
}
185171

186172
public function generateAuthorizationUrl($organizationSlug)
187173
{

0 commit comments

Comments
 (0)