|
|
@@ -0,0 +1,51 @@
|
|
|
+<?php
|
|
|
+declare(strict_types=1);
|
|
|
+
|
|
|
+namespace App\Service\HelloAsso;
|
|
|
+
|
|
|
+use App\Entity\Organization\Organization;
|
|
|
+use App\Service\Rest\ApiRequestService;
|
|
|
+use App\Service\Utils\UrlBuilder;
|
|
|
+use Doctrine\ORM\EntityManagerInterface;
|
|
|
+use Symfony\Contracts\HttpClient\HttpClientInterface;
|
|
|
+use Symfony\Contracts\HttpClient\ResponseInterface;
|
|
|
+use Symfony\Component\HttpKernel\Exception\HttpException;
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Service de connexion à HelloAsso.
|
|
|
+ *
|
|
|
+ * @see doc/helloasso.md
|
|
|
+ * @see https://dev.helloasso.com/docs/mire-authorisation
|
|
|
+ */
|
|
|
+class ConnectionService extends ApiRequestService
|
|
|
+{
|
|
|
+ /**
|
|
|
+ * Retourne l'URL de redirection pour le callback HelloAsso.
|
|
|
+ * Valide que l'URL de destination correspond au format autorisé et transmet
|
|
|
+ * les paramètres de query (excepté 'state').
|
|
|
+ *
|
|
|
+ * @param array<string, string> $queryParameters Paramètres de la requête originale
|
|
|
+ * @return string L'URL vers laquelle rediriger l'utilisateur
|
|
|
+ * @throws HttpException Si le paramètre 'state' est manquant ou l'URL invalide
|
|
|
+ */
|
|
|
+ public function forwardCallbackTo(array $queryParameters): string
|
|
|
+ {
|
|
|
+ if (!isset($queryParameters['state']) || empty($queryParameters['state'])) {
|
|
|
+ throw new HttpException(400, 'Missing required state parameter');
|
|
|
+ }
|
|
|
+
|
|
|
+ $redirectUrl = $queryParameters['state'];
|
|
|
+
|
|
|
+ // Validation du format de l'URL (doit être https://***.opentalent.fr?***)
|
|
|
+ if (!preg_match('/^https:\/\/[^\/]+\.opentalent\.fr(\/[\w-]+)*(\?.*)?$/', $redirectUrl)) {
|
|
|
+ throw new HttpException(400, 'Invalid redirect URL format. Must be https://***.opentalent.fr/...');
|
|
|
+ }
|
|
|
+
|
|
|
+ // Supprimer le paramètre 'state' des paramètres à transmettre
|
|
|
+ $forwardParams = $queryParameters;
|
|
|
+ unset($forwardParams['state']);
|
|
|
+
|
|
|
+ return UrlBuilder::concatParameters($redirectUrl, $forwardParams);
|
|
|
+ }
|
|
|
+}
|