{"id":23072071,"url":"https://github.com/sanogotech/phpkeycloak","last_synced_at":"2025-04-03T10:42:51.072Z","repository":{"id":236490625,"uuid":"792713597","full_name":"sanogotech/phpkeycloak","owner":"sanogotech","description":"php keycloak integration","archived":false,"fork":false,"pushed_at":"2024-04-30T15:26:07.000Z","size":1490,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-09T00:16:38.497Z","etag":null,"topics":["authentication","iam","keycloak","php","security"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sanogotech.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-04-27T11:09:03.000Z","updated_at":"2024-04-30T15:26:11.000Z","dependencies_parsed_at":"2024-04-30T15:55:57.416Z","dependency_job_id":null,"html_url":"https://github.com/sanogotech/phpkeycloak","commit_stats":null,"previous_names":["sanogotech/phpkeycloak"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sanogotech%2Fphpkeycloak","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sanogotech%2Fphpkeycloak/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sanogotech%2Fphpkeycloak/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sanogotech%2Fphpkeycloak/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sanogotech","download_url":"https://codeload.github.com/sanogotech/phpkeycloak/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246989505,"owners_count":20865305,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["authentication","iam","keycloak","php","security"],"created_at":"2024-12-16T07:18:48.570Z","updated_at":"2025-04-03T10:42:51.055Z","avatar_url":"https://github.com/sanogotech.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"\n\n# Intégration de Keycloak avec PHP\n\nCe guide explique comment intégrer Keycloak à une application PHP pour gérer l'authentification et l'autorisation des utilisateurs.\n\n\n\n## Prérequis\n\n- Un serveur Keycloak opérationnel sur le port 8090\n- PHP installé localement ou sur un serveur, configuré pour écouter sur le port 8080\n- Composer pour la gestion des dépendances PHP\n\n## Étape 1 : Installation de Keycloak (Optionnel)\n\nSi vous n'avez pas encore Keycloak installé et que vous souhaitez configurer un environnement de test ou de développement, suivez ces instructions. Si vous comptez vous connecter à un environnement de recette ou de production déjà en place, vous pouvez passer cette étape.\n\nTéléchargez et installez Keycloak depuis [le site officiel](https://www.keycloak.org/downloads.html). Suivez les instructions pour démarrer le serveur sur le port 8090.\n\n## Étape 2 : Configuration de Keycloak\n\n### Qu'est-ce qu'un Realm ?\n\nUn **realm** dans Keycloak représente un espace virtuel où l'on gère un ensemble d'utilisateurs, leurs rôles, les groupes et les applications. Chaque realm est une entité indépendante avec son propre ensemble d'utilisateurs, clients (applications) et configurations de sécurité. Les realms sont utiles pour configurer des environnements distincts pour différents départements ou projets au sein d'une même organisation.\n\n### Création d'un Realm\n\n1. Connectez-vous à la console d'administration de Keycloak à l'adresse `http://192.168.1.100:8090`.\n2. Cliquez sur `Add realm`.\n3. Nommez-le `SecureSpaceCRM` et confirmez avec `Create`.\n\n### Création d'un Client\n\n1. Allez à `Clients` dans le menu de gauche et cliquez sur `Create`.\n2. Entrez `my_phpCRM_app` comme `Client ID`.\n3. Sélectionnez `public` pour `Access Type`.\n4. Configurez `Valid Redirect URIs` pour utiliser une adresse IP spécifique (ex. `http://192.168.1.5:8080/*`).\n5. Cliquez sur `Save`.\n\n**Synthèse**\n   \n| Action                       | Description                                                                                                                                                      |\n|------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| Création d'un Realm          | - Accédez à `Add realm`.\u003cbr\u003e- Nommez le realm `SecureSpaceCRM` et confirmez avec `Create`.                                                                        |\n| Création d'un Client         | - Allez à `Clients`.\u003cbr\u003e- Cliquez sur `Create`.\u003cbr\u003e- Entrez `my_phpCRM_app` comme `Client ID`.\u003cbr\u003e- Sélectionnez `public` pour `Access Type`.\u003cbr\u003e- Configurez `Valid Redirect URIs` à `http://192.168.1.5:8080/*`.\u003cbr\u003e- Cliquez sur `Save`. |\n| Ajout d'un Utilisateur       | - Allez à `Users`.\u003cbr\u003e- Cliquez sur `Add user`.\u003cbr\u003e- Remplissez les champs requis (Username, Email, First Name, Last Name).\n\n** Exemple pour illuster comment configurarer Keycloak deuis l'interface Admin Web\"**\n\n![Keycloak Client](https://github.com/sanogotech/phpkeycloak/blob/main/images/oauth-client-secret-keyclock.jpg)\n\n### Ajout d'un Utilisateur (Optionnel)\n\n1. Allez à `Users` dans le menu de gauche de la console d'administration de Keycloak.\n2. Cliquez sur `Add user`.\n3. Remplissez les champs requis pour le nouvel utilisateur :\n   - **Username:** Saisissez un nom d'utilisateur, par exemple `koffi`.\n   - **Email:** Optionnel, mais vous pouvez saisir une adresse email pour l'utilisateur.\n   - **First Name:** Prénom de l'utilisateur.\n   - **Last Name:** Nom de famille de l'utilisateur.\n   - **Enabled:** Assurez-vous que cette option est activée pour permettre à l'utilisateur de se connecter.\n4. Cliquez sur `Save` pour créer l'utilisateur.\n5. Après avoir enregistré l'utilisateur, ouvrez l'onglet `Credentials` de l'utilisateur créé.\n6. Entrez un mot de passe initial pour l'utilisateur dans le champ `New Password` et confirmez-le dans `Password Confirmation`.\n7. Assurez-vous que l'option `Temporary` est décochée si vous ne voulez pas obliger l'utilisateur à changer de mot de passe à sa première connexion.\n8. Cliquez sur `Set Password` pour appliquer le nouveau mot de passe.\n\n## Étape 3 : Installation des dépendances PHP\n\nUtilisez Composer pour installer le client OAuth2 :\n\n```bash\ncomposer require league/oauth2-client\n```\n## Étape 4 : Création du script PHP\n\n\n\nCréez un fichier index.php :\n\n** Exemple  simple** \n\n```php\n\n\u003c?php\nrequire_once 'vendor/autoload.php';\n\nuse League\\OAuth2\\Client\\Provider\\GenericProvider;\n\n$provider = new GenericProvider([\n    'clientId'                =\u003e 'my_phpCRM_app',\n    'clientSecret'            =\u003e '',\n    'redirectUri'             =\u003e 'http://192.168.1.5:8080/',\n    'urlAuthorize'            =\u003e 'http://192.168.1.100:8090/auth/realms/SecureSpaceCRM/protocol/openid-connect/auth',\n    'urlAccessToken'          =\u003e 'http://192.168.1.100:8090/auth/realms/SecureSpaceCRM/protocol/openid-connect/token',\n    'urlResourceOwnerDetails' =\u003e 'http://192.168.1.100:8090/auth/realms/SecureSpaceCRM/protocol/openid-connect/userinfo'\n]);\n\nif (!isset($_GET['code'])) {\n    $authorizationUrl = $provider-\u003egetAuthorizationUrl();\n    $_SESSION['oauth2state'] = $provider-\u003egetState();\n    header('Location: ' . $authorizationUrl);\n    exit;\n} elseif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) {\n    unset($_SESSION['oauth2state']);\n    exit('Invalid state');\n} else {\n    $accessToken = $provider-\u003egetAccessToken('authorization_code', ['code' =\u003e $_GET['code']]);\n    echo 'Access Token: ' . $accessToken-\u003egetToken();\n}\n\n```\n\n**Exemple avec gestions des erreurs**\n\n\n```php\n\u003c?php\nrequire_once 'vendor/autoload.php';\n\nuse League\\OAuth2\\Client\\Provider\\GenericProvider;\nuse League\\OAuth2\\Client\\Provider\\Exception\\IdentityProviderException;\n\nsession_start();\n\n$provider = new GenericProvider([\n    'clientId'                =\u003e 'my_phpCRM_app',\n    'clientSecret'            =\u003e '',  // Assurez-vous de sécuriser le secret client dans un environnement de production\n    'redirectUri'             =\u003e 'http://192.168.1.5:8080/',\n    'urlAuthorize'            =\u003e 'http://192.168.1.100:8090/auth/realms/SecureSpaceCRM/protocol/openid-connect/auth',\n    'urlAccessToken'          =\u003e 'http://192.168.1.100:8090/auth/realms/SecureSpaceCRM/protocol/openid-connect/token',\n    'urlResourceOwnerDetails' =\u003e 'http://192.168.1.100:8090/auth/realms/SecureSpaceCRM/protocol/openid-connect/userinfo'\n]);\n\ntry {\n    if (!isset($_GET['code'])) {\n        $authorizationUrl = $provider-\u003egetAuthorizationUrl();\n        $_SESSION['oauth2state'] = $provider-\u003egetState();\n        header('Location: ' . $authorizationUrl);\n        exit;\n    } elseif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) {\n        unset($_SESSION['oauth2state']);\n        throw new Exception('Invalid state');\n    } else {\n        $accessToken = $provider-\u003egetAccessToken('authorization_code', ['code' =\u003e $_GET['code']]);\n        echo 'Access Token: ' . $accessToken-\u003egetToken();\n    }\n} catch (IdentityProviderException $e) {\n    // Token acquisition failed\n    exit('Token acquisition failed: ' . $e-\u003egetMessage());\n} catch (Exception $e) {\n    // Other errors\n    exit('An error occurred: ' . $e-\u003egetMessage());\n}\n```\n\n**Synthèse**\n\n| Fichier      | Action                                                                                                                                                                   |\n|--------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `index.php`  | - Créer le fichier PHP.                                                                                                                                                  |\n| Configuration| - Importer les dépendances avec `require_once 'vendor/autoload.php'`.                                                                                                     |\n|              | - Utiliser la classe `League\\OAuth2\\Client\\Provider\\GenericProvider`.                                                                                                     |\n|              | - Configurer l'instance de `GenericProvider` avec les paramètres :                                                                                                        |\n|              |   - `clientId` : `my_phpCRM_app`                                                                                                                                            |\n|              |   - `clientSecret` : `''` (laisser vide pour un client public)                                                                                                           |\n|              |   - `redirectUri` : `http://192.168.1.5:8080/`                                                                                                                           |\n|              |   - `urlAuthorize` : `http://192.168.1.100:8090/auth/realms/SecureSpaceCRM/protocol/openid-connect/auth`                                                                 |\n|              |   - `urlAccessToken` : `http://192.168.1.100:8090/auth/realms/SecureSpaceCRM/protocol/openid-connect/token`                                                              |\n|              |   - `urlResourceOwnerDetails` : `http://192.168.1.100:8090/auth/realms/SecureSpaceCRM/protocol/openid-connect/userinfo`                                                  |\n\n## Étape 5 : Diagramme de Séquence Détaillé\n\n```mermaid\nsequenceDiagram\n    participant U as Utilisateur\n    participant P as Application PHP\n    participant K as Keycloak\n    participant AD as Active Directory\n    participant BD as Base de données locale Keycloak\n\n    U-\u003e\u003eP: Demande d'authentification\n    P-\u003e\u003eK: Redirection vers Keycloak\n    K-\u003e\u003eU: Formulaire de connexion\n\n    U-\u003e\u003eK: Soumet les credentials\n    K-\u003e\u003eBD: Vérifie si l'utilisateur existe dans la base locale\n    BD--\u003e\u003eK: Résultat de la vérification\n\n    alt Si utilisateur non trouvé dans la base locale\n        K-\u003e\u003eAD: Requête pour vérifier l'utilisateur\n        AD--\u003e\u003eK: Réponse d'AD (utilisateur trouvé ou non)\n        alt Si utilisateur trouvé dans AD\n            K-\u003e\u003eBD: Crée ou met à jour l'utilisateur dans la base locale\n        end\n    end\n\n    alt Authentification réussie\n        K--\u003e\u003eP: Renvoie le token à l'application\n        P--\u003e\u003eU: Accès autorisé\n    else Authentification échouée\n        K--\u003e\u003eU: Affiche erreur d'authentification\n    end\n\n```\n\nLe tableau suivant résume les interactions clés entre l'utilisateur, l'application PHP, Keycloak, la base de données locale de Keycloak, et Active Directory pendant le processus d'authentification.\n\n| Participant               | Action                                                                                              | Description                                                                                        |\n|---------------------------|-----------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------|\n| Utilisateur (U)           | Demande d'authentification                                                                          | L'utilisateur initie le processus en tentant de se connecter via l'application PHP.                |\n| Application PHP (P)       | Redirection vers Keycloak                                                                           | L'application redirige l'utilisateur vers le formulaire de connexion de Keycloak.                  |\n| Utilisateur (U)           | Soumet les credentials                                                                              | L'utilisateur entre ses identifiants sur le formulaire de connexion de Keycloak.                   |\n| Keycloak (K)              | Vérification dans la base de données locale                                                         | Keycloak vérifie si l'utilisateur existe dans sa base de données locale.                           |\n| Base de données locale (BD)| Réponse à Keycloak                                                                                 | La base de données locale renvoie le résultat de la vérification à Keycloak.                       |\n| Keycloak (K)              | Requête à Active Directory si nécessaire                                                            | Si l'utilisateur n'est pas trouvé localement, Keycloak vérifie dans Active Directory.              |\n| Active Directory (AD)     | Réponse à Keycloak                                                                                  | Active Directory confirme si l'utilisateur existe ou non.                                          |\n| Keycloak (K)              | Mise à jour de la base locale                                                                       | Si trouvé dans AD, Keycloak crée ou met à jour l'utilisateur dans sa base de données locale.       |\n| Keycloak (K)              | Renvoie le token à l'application                                                                    | Si l'authentification est réussie, Keycloak renvoie un token à l'application PHP.                  |\n| Application PHP (P)       | Accès autorisé à l'utilisateur                                                                      | L'utilisateur reçoit l'accès après validation du token par l'application PHP.                      |\n| Keycloak (K)              | Affiche erreur d'authentification                                                                   | Si l'authentification échoue, Keycloak affiche un message d'erreur à l'utilisateur.                |\n\nCe tableau aide à visualiser et comprendre les étapes séquentielles et les décisions prises lors de l'authentification d'un utilisateur, montrant l'interaction entre différents systèmes pour gérer l'authentification de manière sécurisée et efficace.\n\n** Exemple Page de login /Keycloak**\n\n![Login Page](https://github.com/sanogotech/phpkeycloak/blob/main/images/keycloaklogin.png)\n\n### Synthèse de l'Ajout de la Gestion des Erreurs\n\n| Action                           | Description                                                                                                                                                             |\n|----------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| Importation des classes          | Importer `GenericProvider` et `IdentityProviderException` de la bibliothèque OAuth2 pour gérer l'authentification et les exceptions.                                    |\n| Démarrage de session             | Démarrer une session PHP pour sauvegarder l'état OAuth2 entre les requêtes.                                                                                             |\n| Configuration de `GenericProvider` | Définir les paramètres du fournisseur OAuth2 incluant les URLs pour l'autorisation, l'obtention du token, et les informations de l'utilisateur.                         |\n| Bloc `try-catch`                 | Utiliser un bloc `try-catch` pour attraper et gérer les exceptions durant l'authentification et l'échange de token.                                                     |\n| Gestion de `IdentityProviderException` | Attraper spécifiquement les exceptions liées à l'échec de l'acquisition du token pour fournir un message d'erreur clair.                                                 |\n| Gestion des autres exceptions    | Attraper toutes les autres exceptions pour éviter les interruptions de script et fournir des détails pour le débogage.                                                  |\n\nCe tableau offre un aperçu clair des étapes ajoutées au script PHP pour gérer les erreurs, rendant le processus d'intégration avec Keycloak plus résilient aux problèmes potentiels. Cela permet également aux développeurs qui utilisent le guide de comprendre rapidement les modifications et les ajouts sans avoir à analyser tout le script modifié en détail.\n\n\n## Étape 6 : Exécution et Test\n\n- Lancez le serveur PHP sur un port spécifique (ex. `php -S 192.168.1.5:8080` dans le répertoire de votre projet).\n- Accédez à `http://192.168.1.5:8080/` dans votre navigateur.\n- Vous serez redirigé vers Keycloak pour la connexion.\n- Utilisez les informations d'identification de l'utilisateur de test pour vous connecter :\n  - **Username:** koffi\n  - **Password:** ing2024\n\n## Commentaire sur l'utilisation de `localhost`\n\n- Pour un développement et des tests locaux, remplacez `192.168.1.5` par `localhost` et ajustez les ports comme nécessaire.\n\n## Divers / Sécurité et recommandations (Bonus)\nIl est essentiel de sécuriser les communications entre votre application PHP et Keycloak. Assurez-vous que tous les échanges de données sont effectués sur HTTPS et que le clientSecret est bien protégé et n'est pas exposé publiquement.\n\n**Protection du clientSecret**\n\nLe clientSecret est une clé utilisée pour sécuriser la communication entre votre application et Keycloak. Il est crucial de le garder sécurisé et de ne jamais l'exposer publiquement.\n\nExemple :\n\n```php\n// Stockez le clientSecret dans un fichier de configuration sécurisé ou une variable d'environnement\n$clientSecret = getenv('KEYCLOAK_CLIENT_SECRET');\n```\n## Conclusion\n\nVous avez maintenant une application PHP capable de s'authentifier via Keycloak en utilisant les informations de connexion d'un utilisateur de test. Adaptez les paramètres et les configurations selon les besoins spécifiques de votre projet.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsanogotech%2Fphpkeycloak","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsanogotech%2Fphpkeycloak","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsanogotech%2Fphpkeycloak/lists"}