Skip to content

Commit

Permalink
Add AgentConnect Provider
Browse files Browse the repository at this point in the history
Keycloak does not support ES256 signature with OIDC provider, so we need to verify by ourselves.
AgentConnect publishes the keys on a JWKS URL but for the RSA Key, there is not usage, so we cannot directly
use the lkeycloak way and need to internalise it to do some null checking.

Signed-off-by: Cédric Couralet <[email protected]>
  • Loading branch information
micedre committed Nov 5, 2021
1 parent 0476018 commit a3c6196
Show file tree
Hide file tree
Showing 22 changed files with 1,556 additions and 62 deletions.
17 changes: 15 additions & 2 deletions README.en.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
# keycloak-franceconnect

- [keycloak-franceconnect](#keycloak-franceconnect)
- [Features](#features)
- [Compatibility](#compatibility)
- [Migration](#migration)
- [Installation](#installation)
- [How to use it](#how-to-use-it)
- [Requirements](#requirements)
- [Configuration](#configuration)
- [Mappers](#mappers)
- [Theme](#theme)
- [Q&A](#qa)
- [How to contribute](#how-to-contribute)

This [Keycloak](https://www.keycloak.org) plugin adds an identity provider allowing to use [France Connect](https://franceconnect.gouv.fr/) services.

[![Build Status](https://travis-ci.org/inseefr/Keycloak-FranceConnect.svg?branch=master)](https://travis-ci.org/inseefr/Keycloak-FranceConnect)
Expand All @@ -13,8 +26,8 @@ This [Keycloak](https://www.keycloak.org) plugin adds an identity provider allow

## Compatibility

The version 2.1 of this plugin is compatible with Keycloak `9.0.2` and higher.
The version 2.0 of this plugin is compatible with Keycloak `8.0.1` until `9.0.2`.
* The version 2.1 and above of this plugin is compatible with Keycloak `9.0.2` and higher.
* The version 2.0 of this plugin is compatible with Keycloak `8.0.1` until `9.0.2`.

## Migration

Expand Down
68 changes: 61 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,25 @@

[English Version](README.en.md)

- [keycloak-franceconnect](#keycloak-franceconnect)
- [Fonctionnalités](#fonctionnalités)
- [Compatibilité](#compatibilité)
- [Migration](#migration)
- [Installation](#installation)
- [Utilisation](#utilisation)
- [France Connect](#france-connect)
- [Prérequis](#prérequis)
- [Configuration](#configuration)
- [Mappers](#mappers)
- [Agent Connect](#agent-connect)
- [Prérequis](#prérequis-1)
- [Configuration](#configuration-1)
- [Mappers](#mappers-1)
- [Thème](#thème)
- [FAQ](#faq)
- [Comment contribuer](#comment-contribuer)


Cette extension pour [Keycloak](https://www.keycloak.org) ajoute un fournisseur d'identité permettant d'utiliser les services proposés par [France Connect](https://franceconnect.gouv.fr/).

[![Build Status](https://travis-ci.org/inseefr/Keycloak-FranceConnect.svg?branch=master)](https://travis-ci.org/inseefr/Keycloak-FranceConnect)
Expand All @@ -12,11 +31,12 @@ Cette extension pour [Keycloak](https://www.keycloak.org) ajoute un fournisseur
* Gestion du niveau d'authentification (eIDAS) dans la demande d'autorisation (cf [communication FranceConnect](https://dev.entrouvert.org/issues/34448))
* Thèmes de connexion permettant l'affichage des boutons France Connect (fc-theme et iron-theme)
* Meilleure gestion du logout (contourne https://issues.jboss.org/browse/KEYCLOAK-7209)
* Provider pour [AgentConnect](https://agentconnect.gouv.fr/)

## Compatibilité

La version 2.1 est compatible avec Keycloak `9.0.2` et supérieur.
La version 2.0 est compatible avec Keycloak `8.0.1` jusqu'à `9.0.0`.
- La version 2.1 est compatible avec Keycloak `9.0.2` et supérieur.
- La version 2.0 est compatible avec Keycloak `8.0.1` jusqu'à `9.0.0`.

## Migration

Expand All @@ -41,13 +61,14 @@ $ mvn clean install wildfly:deploy

## Utilisation

### Prérequis
### France Connect
#### Prérequis

Vous devez créer un [compte France Connect](https://franceconnect.gouv.fr/partenaires) afin de récupérer les informations nécessaires à la configuration de cette extension (clientId, clientSecret, configuration de l'url de redirection autorisée, ...).

Il existe 2 environnements de connexion, `Integration` et `Production`. La demande d'un compte permettant l'accès à l'environnement d'Intégration s'effectue par email au service support de France Connect.

### Configuration
#### Configuration

Suite à l'installation de l'extension, le fournisseur d'identité `France Connect Particulier` est apparu. Une fois ce dernier selectionné, vous arrivez sur la page de configuration suivante :

Expand All @@ -60,7 +81,7 @@ Vous trouverez également l'url de redirection qu'il faudra enregistrer sur le p
* endpoint : `https://<keycloak-url>/auth/realms/<realm>/broker/franceconnect-particulier/endpoint`
* logout : `https://<keycloak-url>/auth/realms/<realm>/broker/franceconnect-particulier/endpoint/logout_response`

#### Mappers
##### Mappers

Une fois la configuration validée, vous pouvez ajouter des mappers afin de récupérer les attributs à partir [des claims fournis par France Connect](https://partenaires.franceconnect.gouv.fr/fcp/fournisseur-service).

Expand All @@ -69,13 +90,46 @@ Exemples de mappers :
* Name : `firstName`, Mapper Type : `Attribute Importer`, Claim : `given_name`, User Attribute Name : `firstName`
* Name : `email`, Mapper Type : `Attribute Importer`, Claim : `email`, User Attribute Name : `email`

#### Thème
### Agent Connect

La version 3.0 de cette extension ajoute le support pour AgentConnect pour l'authentification des agents de la fonction publique d'Etat : https://github.com/france-connect/Documentation-AgentConnect.
#### Prérequis

De la même façon que pour France Connect il vous faudra demander la création d'un compte sur agent connect.

Il existe 2 environnements de connexion, `Integration` et `Production`. La demande d'un compte permettant l'accès à l'environnement d'Intégration s'effectue par email au service support d'Agent Connect.

#### Configuration

Suite à l'installation de l'extension, le fournisseur d'identité `Agent Connect` est apparu. Une fois ce dernier selectionné, vous arrivez sur la page de configuration suivante :

![keycloak-fc-conf-provider](/assets/keycloak-fc-conf-provider.png)

Sélectionnez l'environnement désiré, entrez votre clientId, clientSecret, [les scopes](https://github.com/france-connect/Documentation-AgentConnect/blob/main/doc-fs.md#les-donn%C3%A9es-agent) que vous souhaitez demander, le niveau d'authentification eIDAS.
L'alias configuré par défaut (`agentconnect`) est utilisé par le thèmes `ac-theme`. Vous pouvez donc modifier le nom de l'alias si vous n'utilisez pas un de ces thèmes.

Vous trouverez également l'url de redirection qu'il faudra enregistrer sur le portail Partenaire de France Connect :
* endpoint : `https://<keycloak-url>/auth/realms/<realm>/broker/agentconnect/endpoint`
* logout : `https://<keycloak-url>/auth/realms/<realm>/broker/agentconnect/endpoint/logout_response`

##### Mappers

Une fois la configuration validée, vous pouvez ajouter des mappers afin de récupérer les attributs à partir [des claims fournis par France Connect](https://github.com/france-connect/Documentation-AgentConnect/blob/main/doc-fs.md#les-donn%C3%A9es-agent).

Exemples de mappers :
* Name : `lastName`, Mapper Type : `Attribute Importer`, Claim : `family_name`, User Attribute Name : `lastName`
* Name : `firstName`, Mapper Type : `Attribute Importer`, Claim : `given_name`, User Attribute Name : `firstName`
* Name : `email`, Mapper Type : `Attribute Importer`, Claim : `email`, User Attribute Name : `email`


### Thème

Cette extension fournit 2 thèmes :
* `fc-theme`
* `iron-theme`
* `ac-theme`

Utilisez le thème de votre choix, et rendez-vous à l'adresse suivante : `https://<keycloak-url>/auth/realms/<realm>/account`
Utilisez le thème de votre choix (selon le service que vous utilisez), et rendez-vous à l'adresse suivante : `https://<keycloak-url>/auth/realms/<realm>/account`

![keycloak-fc-login](/assets/keycloak-fc-login.png)

Expand Down
4 changes: 2 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

<groupId>fr.insee.keycloak</groupId>
<artifactId>keycloak-franceconnect</artifactId>
<version>2.4-SNAPSHOT</version>
<version>3.0.0-SNAPSHOT</version>

<name>${project.groupId}:${project.artifactId}</name>
<description>France Connect Openid-Connect Provider for Keycloak</description>
Expand Down Expand Up @@ -68,7 +68,7 @@
<maven.javadoc.plugin.version>3.1.1</maven.javadoc.plugin.version>
<wildfly.maven.plugin.version>2.0.2.Final</wildfly.maven.plugin.version>

<keycloak.version>9.0.2</keycloak.version>
<keycloak.version>12.0.4</keycloak.version>
</properties>

<build>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,26 @@
package fr.insee.keycloak.mappers;

import fr.insee.keycloak.provider.AgentConnectIdentityProviderFactory;
import fr.insee.keycloak.provider.FranceConnectIdentityProviderFactory;
import org.keycloak.broker.oidc.mappers.UserAttributeMapper;

public class FranceConnectUserAttributeMapper extends UserAttributeMapper {

private static final String MAPPER_NAME = "franceconnect-user-attribute-mapper";
private static final String MAPPER_NAME = "franceconnect-user-attribute-mapper";

@Override
public String[] getCompatibleProviders() {
return FranceConnectIdentityProviderFactory.COMPATIBLE_PROVIDER;
}
public static final String[] COMPATIBLE_PROVIDERS =
new String[] {
AgentConnectIdentityProviderFactory.AC_PROVIDER_ID,
FranceConnectIdentityProviderFactory.FC_PROVIDER_ID
};

@Override
public String getId() {
return MAPPER_NAME;
}
@Override
public String[] getCompatibleProviders() {
return COMPATIBLE_PROVIDERS;
}

@Override
public String getId() {
return MAPPER_NAME;
}
}
Original file line number Diff line number Diff line change
@@ -1,20 +1,26 @@
package fr.insee.keycloak.mappers;

import fr.insee.keycloak.provider.AgentConnectIdentityProviderFactory;
import fr.insee.keycloak.provider.FranceConnectIdentityProviderFactory;
import org.keycloak.broker.oidc.mappers.UsernameTemplateMapper;

public class FranceConnectUsernameTemplateMapper extends UsernameTemplateMapper {

private static final String MAPPER_NAME = "franceconnect-username-template-mapper";
private static final String MAPPER_NAME = "franceconnect-username-template-mapper";

@Override
public String[] getCompatibleProviders() {
return FranceConnectIdentityProviderFactory.COMPATIBLE_PROVIDER;
}
public static final String[] COMPATIBLE_PROVIDERS =
new String[] {
AgentConnectIdentityProviderFactory.AC_PROVIDER_ID,
FranceConnectIdentityProviderFactory.FC_PROVIDER_ID
};

@Override
public String getId() {
return MAPPER_NAME;
}
@Override
public String[] getCompatibleProviders() {
return COMPATIBLE_PROVIDERS;
}

@Override
public String getId() {
return MAPPER_NAME;
}
}
Loading

0 comments on commit a3c6196

Please sign in to comment.