<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://marmits.com/w/index.php?action=history&amp;feed=atom&amp;title=Apiplatform_Keycloak_Lexik</id>
	<title>Apiplatform Keycloak Lexik - Historique des versions</title>
	<link rel="self" type="application/atom+xml" href="https://marmits.com/w/index.php?action=history&amp;feed=atom&amp;title=Apiplatform_Keycloak_Lexik"/>
	<link rel="alternate" type="text/html" href="https://marmits.com/w/index.php?title=Apiplatform_Keycloak_Lexik&amp;action=history"/>
	<updated>2026-04-03T20:15:51Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://marmits.com/w/index.php?title=Apiplatform_Keycloak_Lexik&amp;diff=2969&amp;oldid=prev</id>
		<title>Geo : /* 9. Documentation supplémentaire */</title>
		<link rel="alternate" type="text/html" href="https://marmits.com/w/index.php?title=Apiplatform_Keycloak_Lexik&amp;diff=2969&amp;oldid=prev"/>
		<updated>2025-03-19T06:21:56Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;9. Documentation supplémentaire&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;fr&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Version précédente&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version du 19 mars 2025 à 08:21&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l232&quot;&gt;Ligne 232 :&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Ligne 232 :&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [https://www.keycloak.org/documentation Keycloak Documentation]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* [https://www.keycloak.org/documentation Keycloak Documentation]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;=== Voir [[ Apiplatform_TokenValidator_Lexik|Apiplatform TokenValidator Lexik]] ===&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;-----&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;-----&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;source:DeepSeek&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;source:DeepSeek&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Catégorie: Apiplatform]] [[category:api]] [[category:Keycloak]] [[category:DeepSeek]] [[category:Symfony]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Catégorie: Apiplatform]] [[category:api]] [[category:Keycloak]] [[category:DeepSeek]] [[category:Symfony]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key wiki2025-mar_:diff:1.41:old-2966:rev-2969:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Geo</name></author>
	</entry>
	<entry>
		<id>https://marmits.com/w/index.php?title=Apiplatform_Keycloak_Lexik&amp;diff=2966&amp;oldid=prev</id>
		<title>Geo : Page créée avec « Pour intégrer &#039;&#039;&#039;API Platform 4&#039;&#039;&#039; avec &#039;&#039;&#039;Keycloak 26&#039;&#039;&#039; en utilisant &#039;&#039;&#039;OpenID Connect (OIDC)&#039;&#039;&#039;, vous devez configurer l’authentification JWT et sécuriser vos routes API. Voici un guide détaillé pour configurer l’ensemble : -----  &lt;span id=&quot;prérequis&quot;&gt;&lt;/span&gt; === 1. &#039;&#039;&#039;Prérequis&#039;&#039;&#039; ===  * &#039;&#039;&#039;API Platform 4&#039;&#039;&#039; : Déjà installé et configuré. * &#039;&#039;&#039;Keycloak 26&#039;&#039;&#039; : Un fournisseur OIDC configuré avec un client pour votre application. * &#039;&#039;&#039;LexikJWTAuth... »</title>
		<link rel="alternate" type="text/html" href="https://marmits.com/w/index.php?title=Apiplatform_Keycloak_Lexik&amp;diff=2966&amp;oldid=prev"/>
		<updated>2025-03-19T06:14:39Z</updated>

		<summary type="html">&lt;p&gt;Page créée avec « Pour intégrer &amp;#039;&amp;#039;&amp;#039;API Platform 4&amp;#039;&amp;#039;&amp;#039; avec &amp;#039;&amp;#039;&amp;#039;Keycloak 26&amp;#039;&amp;#039;&amp;#039; en utilisant &amp;#039;&amp;#039;&amp;#039;OpenID Connect (OIDC)&amp;#039;&amp;#039;&amp;#039;, vous devez configurer l’authentification JWT et sécuriser vos routes API. Voici un guide détaillé pour configurer l’ensemble : -----  &amp;lt;span id=&amp;quot;prérequis&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; === 1. &amp;#039;&amp;#039;&amp;#039;Prérequis&amp;#039;&amp;#039;&amp;#039; ===  * &amp;#039;&amp;#039;&amp;#039;API Platform 4&amp;#039;&amp;#039;&amp;#039; : Déjà installé et configuré. * &amp;#039;&amp;#039;&amp;#039;Keycloak 26&amp;#039;&amp;#039;&amp;#039; : Un fournisseur OIDC configuré avec un client pour votre application. * &amp;#039;&amp;#039;&amp;#039;LexikJWTAuth... »&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Pour intégrer &amp;#039;&amp;#039;&amp;#039;API Platform 4&amp;#039;&amp;#039;&amp;#039; avec &amp;#039;&amp;#039;&amp;#039;Keycloak 26&amp;#039;&amp;#039;&amp;#039; en utilisant &amp;#039;&amp;#039;&amp;#039;OpenID Connect (OIDC)&amp;#039;&amp;#039;&amp;#039;, vous devez configurer l’authentification JWT et sécuriser vos routes API. Voici un guide détaillé pour configurer l’ensemble :&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;prérequis&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 1. &amp;#039;&amp;#039;&amp;#039;Prérequis&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;API Platform 4&amp;#039;&amp;#039;&amp;#039; : Déjà installé et configuré.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Keycloak 26&amp;#039;&amp;#039;&amp;#039; : Un fournisseur OIDC configuré avec un client pour votre application.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;LexikJWTAuthenticationBundle&amp;#039;&amp;#039;&amp;#039; : Pour gérer les JWT dans Symfony.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;installation-des-dépendances&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 2. &amp;#039;&amp;#039;&amp;#039;Installation des dépendances&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&lt;br /&gt;
Installez les packages nécessaires via Composer :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;composer require web-token/jwt-framework&lt;br /&gt;
composer require lexik/jwt-authentication-bundle&lt;br /&gt;
composer require league/oauth2-client&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;configuration-de-lexikjwtauthenticationbundle&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 3. &amp;#039;&amp;#039;&amp;#039;Configuration de LexikJWTAuthenticationBundle&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;a.-configurer-les-clés-jwt&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== a. &amp;#039;&amp;#039;&amp;#039;Configurer les clés JWT&amp;#039;&amp;#039;&amp;#039; ====&lt;br /&gt;
&lt;br /&gt;
Générez les clés privée et publique pour signer les JWT :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;mkdir -p config/jwt&lt;br /&gt;
openssl genpkey -out config/jwt/private.pem -aes256 -algorithm rsa -pkeyopt rsa_keygen_bits:4096&lt;br /&gt;
openssl pkey -in config/jwt/private.pem -out config/jwt/public.pem -pubout&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ajoutez les variables d’environnement dans &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;env&amp;quot;&amp;gt;###&amp;amp;gt; lexik/jwt-authentication-bundle ###&lt;br /&gt;
JWT_SECRET_KEY=%kernel.project_dir%/config/jwt/private.pem&lt;br /&gt;
JWT_PUBLIC_KEY=%kernel.project_dir%/config/jwt/public.pem&lt;br /&gt;
JWT_PASSPHRASE=your_passphrase&lt;br /&gt;
###&amp;amp;lt; lexik/jwt-authentication-bundle ###&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;b.-configurer-lexik_jwt_authentication.yaml&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== b. &amp;#039;&amp;#039;&amp;#039;Configurer &amp;lt;code&amp;gt;lexik_jwt_authentication.yaml&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; ====&lt;br /&gt;
&lt;br /&gt;
Ajoutez la configuration suivante dans &amp;lt;code&amp;gt;config/packages/lexik_jwt_authentication.yaml&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;lexik_jwt_authentication:&lt;br /&gt;
    secret_key: &amp;#039;%env(resolve:JWT_SECRET_KEY)%&amp;#039;&lt;br /&gt;
    public_key: &amp;#039;%env(resolve:JWT_PUBLIC_KEY)%&amp;#039;&lt;br /&gt;
    pass_phrase: &amp;#039;%env(JWT_PASSPHRASE)%&amp;#039;&lt;br /&gt;
    token_ttl: 3600 # Durée de validité du token (en secondes)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;configuration-de-keycloak&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 4. &amp;#039;&amp;#039;&amp;#039;Configuration de Keycloak&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;a.-configurer-keycloak&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== a. &amp;#039;&amp;#039;&amp;#039;Configurer Keycloak&amp;#039;&amp;#039;&amp;#039; ====&lt;br /&gt;
&lt;br /&gt;
# Créez un client dans Keycloak.&lt;br /&gt;
# Notez les informations suivantes :&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Client ID&amp;#039;&amp;#039;&amp;#039; : Identifiant du client.&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Client Secret&amp;#039;&amp;#039;&amp;#039; : Clé secrète du client.&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Issuer URL&amp;#039;&amp;#039;&amp;#039; : URL du fournisseur (par exemple, &amp;lt;code&amp;gt;https://keycloak.example.com/auth/realms/{realm}&amp;lt;/code&amp;gt;).&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Authorization URL&amp;#039;&amp;#039;&amp;#039; : URL d’autorisation.&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Token URL&amp;#039;&amp;#039;&amp;#039; : URL pour obtenir les tokens.&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Userinfo URL&amp;#039;&amp;#039;&amp;#039; : URL pour récupérer les informations de l’utilisateur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;b.-configurer-symfony&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== b. &amp;#039;&amp;#039;&amp;#039;Configurer Symfony&amp;#039;&amp;#039;&amp;#039; ====&lt;br /&gt;
&lt;br /&gt;
Ajoutez les informations du fournisseur dans votre fichier &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;env&amp;quot;&amp;gt;###&amp;amp;gt; OIDC Configuration ###&lt;br /&gt;
OIDC_CLIENT_ID=your-client-id&lt;br /&gt;
OIDC_CLIENT_SECRET=your-client-secret&lt;br /&gt;
OIDC_ISSUER=https://keycloak.example.com/auth/realms/{realm}&lt;br /&gt;
OIDC_AUTHORIZATION_URL=https://keycloak.example.com/auth/realms/{realm}/protocol/openid-connect/auth&lt;br /&gt;
OIDC_TOKEN_URL=https://keycloak.example.com/auth/realms/{realm}/protocol/openid-connect/token&lt;br /&gt;
OIDC_USERINFO_URL=https://keycloak.example.com/auth/realms/{realm}/protocol/openid-connect/userinfo&lt;br /&gt;
###&amp;amp;lt; OIDC Configuration ###&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;configurer-le-composant-security&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 5. &amp;#039;&amp;#039;&amp;#039;Configurer le composant Security&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;config/packages/security.yaml&amp;lt;/code&amp;gt;, configurez le pare-feu pour utiliser JWT et OIDC.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;security:&lt;br /&gt;
    enable_authenticator_manager: true&lt;br /&gt;
    providers:&lt;br /&gt;
        jwt_provider:&lt;br /&gt;
            lexik_jwt: ~&lt;br /&gt;
&lt;br /&gt;
    firewalls:&lt;br /&gt;
        api:&lt;br /&gt;
            pattern: ^/api&lt;br /&gt;
            stateless: true&lt;br /&gt;
            jwt: ~&lt;br /&gt;
&lt;br /&gt;
    access_control:&lt;br /&gt;
        - { path: ^/api/login, roles: PUBLIC_ACCESS }&lt;br /&gt;
        - { path: ^/api, roles: ROLE_USER }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;créer-un-contrôleur-dauthentification&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 6. &amp;#039;&amp;#039;&amp;#039;Créer un contrôleur d’authentification&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&lt;br /&gt;
Créez un contrôleur pour gérer la connexion via OIDC et la génération des tokens JWT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;namespace App\Controller;&lt;br /&gt;
&lt;br /&gt;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;&lt;br /&gt;
use Symfony\Component\HttpFoundation\JsonResponse;&lt;br /&gt;
use Symfony\Component\Routing\Annotation\Route;&lt;br /&gt;
use App\Service\OidcService;&lt;br /&gt;
&lt;br /&gt;
class AuthController extends AbstractController&lt;br /&gt;
{&lt;br /&gt;
    #[Route(&amp;#039;/api/login&amp;#039;, name: &amp;#039;api_login&amp;#039;, methods: [&amp;#039;POST&amp;#039;])]&lt;br /&gt;
    public function login(OidcService $oidcService): JsonResponse&lt;br /&gt;
    {&lt;br /&gt;
        $accessToken = $oidcService-&amp;gt;getAccessToken($_POST[&amp;#039;code&amp;#039;]);&lt;br /&gt;
        $userInfo = $oidcService-&amp;gt;getUserInfo($accessToken);&lt;br /&gt;
&lt;br /&gt;
        // Authentifiez l&amp;#039;utilisateur avec les informations de $userInfo&lt;br /&gt;
        // ...&lt;br /&gt;
&lt;br /&gt;
        // Générer un token JWT&lt;br /&gt;
        $jwtToken = $this-&amp;gt;getToken($userInfo);&lt;br /&gt;
&lt;br /&gt;
        return $this-&amp;gt;json([&lt;br /&gt;
            &amp;#039;user&amp;#039; =&amp;gt; $userInfo[&amp;#039;email&amp;#039;],&lt;br /&gt;
            &amp;#039;token&amp;#039; =&amp;gt; $jwtToken,&lt;br /&gt;
        ]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private function getToken(array $userInfo): string&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;container-&amp;gt;get(&amp;#039;lexik_jwt_authentication.encoder&amp;#039;)&lt;br /&gt;
            -&amp;gt;encode([&amp;#039;username&amp;#039; =&amp;gt; $userInfo[&amp;#039;email&amp;#039;]]);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;configurer-api-platform&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 7. &amp;#039;&amp;#039;&amp;#039;Configurer API Platform&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;a.-sécuriser-les-routes-api&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== a. &amp;#039;&amp;#039;&amp;#039;Sécuriser les routes API&amp;#039;&amp;#039;&amp;#039; ====&lt;br /&gt;
&lt;br /&gt;
Dans &amp;lt;code&amp;gt;config/packages/api_platform.yaml&amp;lt;/code&amp;gt;, assurez-vous que les routes API sont sécurisées :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;api_platform:&lt;br /&gt;
    mapping:&lt;br /&gt;
        paths: [&amp;#039;%kernel.project_dir%/src/Entity&amp;#039;]&lt;br /&gt;
    patch_formats:&lt;br /&gt;
        json: [&amp;#039;application/merge-patch+json&amp;#039;]&lt;br /&gt;
    swagger:&lt;br /&gt;
        versions: [3]&lt;br /&gt;
    formats:&lt;br /&gt;
        jsonld:&lt;br /&gt;
            mime_types: [&amp;#039;application/ld+json&amp;#039;]&lt;br /&gt;
        json:&lt;br /&gt;
            mime_types: [&amp;#039;application/json&amp;#039;]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;b.-ajouter-des-contrôles-daccès&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== b. &amp;#039;&amp;#039;&amp;#039;Ajouter des contrôles d’accès&amp;#039;&amp;#039;&amp;#039; ====&lt;br /&gt;
&lt;br /&gt;
Utilisez les annotations ou attributs pour restreindre l’accès aux ressources :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;namespace App\Entity;&lt;br /&gt;
&lt;br /&gt;
use ApiPlatform\Core\Annotation\ApiResource;&lt;br /&gt;
use Symfony\Component\Security\Core\User\UserInterface;&lt;br /&gt;
&lt;br /&gt;
#[ApiResource(&lt;br /&gt;
    collectionOperations: [&lt;br /&gt;
        &amp;#039;get&amp;#039; =&amp;gt; [&amp;#039;security&amp;#039; =&amp;gt; &amp;quot;is_granted(&amp;#039;ROLE_USER&amp;#039;)&amp;quot;],&lt;br /&gt;
        &amp;#039;post&amp;#039; =&amp;gt; [&amp;#039;security&amp;#039; =&amp;gt; &amp;quot;is_granted(&amp;#039;ROLE_ADMIN&amp;#039;)&amp;quot;],&lt;br /&gt;
    ],&lt;br /&gt;
    itemOperations: [&lt;br /&gt;
        &amp;#039;get&amp;#039; =&amp;gt; [&amp;#039;security&amp;#039; =&amp;gt; &amp;quot;is_granted(&amp;#039;ROLE_USER&amp;#039;)&amp;quot;],&lt;br /&gt;
        &amp;#039;put&amp;#039; =&amp;gt; [&amp;#039;security&amp;#039; =&amp;gt; &amp;quot;is_granted(&amp;#039;ROLE_ADMIN&amp;#039;)&amp;quot;],&lt;br /&gt;
        &amp;#039;delete&amp;#039; =&amp;gt; [&amp;#039;security&amp;#039; =&amp;gt; &amp;quot;is_granted(&amp;#039;ROLE_ADMIN&amp;#039;)&amp;quot;],&lt;br /&gt;
    ],&lt;br /&gt;
)]&lt;br /&gt;
class Product&lt;br /&gt;
{&lt;br /&gt;
    // ...&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;valider-les-tokens-jwt&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 8. &amp;#039;&amp;#039;&amp;#039;Valider les tokens JWT&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&lt;br /&gt;
Utilisez &amp;#039;&amp;#039;&amp;#039;Web-Token/JWT-Framework&amp;#039;&amp;#039;&amp;#039; pour valider les tokens JWT reçus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;use Jose\Component\Core\AlgorithmManager;&lt;br /&gt;
use Jose\Component\Core\JWK;&lt;br /&gt;
use Jose\Component\Signature\Algorithm\RS256;&lt;br /&gt;
use Jose\Component\Signature\JWSVerifier;&lt;br /&gt;
&lt;br /&gt;
class TokenValidator&lt;br /&gt;
{&lt;br /&gt;
    private $jwsVerifier;&lt;br /&gt;
&lt;br /&gt;
    public function __construct()&lt;br /&gt;
    {&lt;br /&gt;
        $algorithmManager = new AlgorithmManager([new RS256()]);&lt;br /&gt;
        $this-&amp;gt;jwsVerifier = new JWSVerifier($algorithmManager);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function validateToken(string $token, JWK $jwk): bool&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;jwsVerifier-&amp;gt;verifyWithKey($token, $jwk, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;documentation-supplémentaire&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 9. &amp;#039;&amp;#039;&amp;#039;Documentation supplémentaire&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&lt;br /&gt;
* [https://api-platform.com/docs API Platform Documentation]&lt;br /&gt;
* [https://github.com/lexik/LexikJWTAuthenticationBundle LexikJWTAuthenticationBundle Documentation]&lt;br /&gt;
* [https://www.keycloak.org/documentation Keycloak Documentation]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
source:DeepSeek&lt;br /&gt;
[[Catégorie: Apiplatform]] [[category:api]] [[category:Keycloak]] [[category:DeepSeek]] [[category:Symfony]]&lt;/div&gt;</summary>
		<author><name>Geo</name></author>
	</entry>
</feed>