🔧 Implémentation du protocole OIDC (authorization code flow) pour un Fournisseur de Service
📢 1. Préambule
1.1. Identifiants de tests
Pour tester la configuration de votre Fournisseur de Service tout au long de l'intégration, vous aurez besoin de vous connecter via un Fournisseur d'Identité. Vous trouverez ici les identifiants pour vous connecter au Fournisseur d'Identité de test.
1.2. Valeur de PROCONNECT_DOMAIN
Pour savoir quelles URL appeler au cours de l'authentification, vous aurez besoin de connaître la valeur de PROCONNECT_DOMAIN qui correspond à votre environnement et votre réseau. Vous la trouverez à ce lien.
Toutes les URLs d'appel au serveur ProConnect commenceront par https://PROCONNECT_DOMAIN/api/v2/.
1.3. Modification des redirect_uri
Si vous souhaitez modifier les redirect_uri de connexion ou de déconnexion configurées par ProConnect, la procédure est détaillée ici.
1.4. Exemple d'intégration de test
Voici un exemple d'application qui a implémenté ProConnect : Docs, porté par la Dinum.
📘 2. Mode d'emploi technique
2.1. Intégrer le bouton ProConnect sur votre page de connexion
Quel bouton ProConnect intégrer et comment l'intégrer ?
2.2. Faire pointer le bouton ProConnect vers le authorization_endpoint
Si vous utilisez une bibliothèque agréée, nous vous recommandons de récupérer les URLs via notre Discovery URL : https://PROCONNECT_DOMAIN/api/v2/.well-known/openid-configuration.
Cette Discovery URL vous donnera notamment quatre endpoints qui vous serviront par la suite :
authorization_endpointtoken_endpointuserinfo_endpointend_session_endpoint
Au clic sur le bouton ProConnect :
- générer un
stateet unnoncealéatoires et stockez-les dans la session du navigateur - rediriger l'utilisateur vers le
authorization_endpoint. Les query parameters à ajouter sont décrits ci-dessous.
GET https://PROCONNECT_DOMAIN/api/v2/authorize
2.2.1.1. Description
Implémente le Authorization Endpoint de Openid Connect:
https://openid.net/specs/openid-connect-core-1_0.html#AuthorizationEndpoint
2.2.1.2. Paramètres
| nom | requis/optionnel | type de données | description |
|---|---|---|---|
response_type | requis | string | code |
client_id | requis | string | <CLIENT_ID> Identifiant du FS, communiqué lors de son inscription auprès de ProConnect |
redirect_uri | requis | string | <FS_URL>/<URL_CALLBACK> URL de retour vers le FS, communiquée dans le formulaire Démarches Simplifiées. Attention, cette URL doit être encodée pour être passée en query parameter, doit correspondre exactement à celle communiquée à ProConnect, et est sensible à la présence ou non du / final |
scope | requis | string | <SCOPES> Liste des scopes demandés séparés par des espaces (%20 au format unicode dans l'URL) ou des '+' |
claims | optionnel | string | <CLAIMS> Objet JSON encodé décrivant les claims demandés. Pour récupérer le claim amr qui indique le mode d'authentification double facteur utilisé, spécifiez la valeur {"id_token":{"amr":{"essential":true}}}. Cf. quelles sont les valeurs possibles pour le champ amr ? |
state | requis | string (minimum 32 caractères) | <STATE> Champ obligatoire, généré aléatoirement par le FS, que ProConnect renvoie tel quel dans la redirection qui suit l'authentification, pour être ensuite vérifié par le FS. Il est utilisé afin d'empêcher l'exploitation de failles CSRF |
nonce | requis | string (minimum 32 caractères) | <NONCE> Champ obligatoire, généré aléatoirement par le FS que ProConnect renvoie tel quel dans la réponse à l'appel au Token Endpoint, pour être ensuite vérifié par le FS. Il est utilisé pour empêcher les attaques par rejeu |
prompt | optionnel | string | none si le FS souhaite qu'une erreur soit générée lorsque l'utilisateur ne dispose pas de session ProConnect en cours (utile pour l'implémentation du Silent Login). Par défaut, ProConnect réutilisera une session existante si elle existe sans redemander de connexion, ou bien redirigera l'utilisateur vers la mire de connexion. |
idp_hint | optionnel | string | idp_id désignant le FI vers lequel rediriger l'usager sans passer par la mire ProConnect (cf. doc) |
login_hint | optionnel | string | Adresse email à préremplir dans la mire de connexion ProConnect pour faciliter l'authentification de l'usager (cf. doc) |
Le champ scope et sa différence avec la notion de claims sont expliqués ici. La liste des scopes que pouvez demander est spécifiée ici.
NB: tout paramètre supplémentaire dans l'URL génèrera une erreur Y000400 : Bad Request Exception. Il n'est pas possible d'ajouter d'autres paramètres.
2.3. Implémentation de la route redirect_uri
Il s'agit de la route vers laquelle sera redirigée votre utilisateur dans le navigateur après authentification par le Fournisseur d'Identité.
Les query parameters renvoyés dans l'URL sont décrits ci-dessous.
GET redirect_uri?code=x&state=y
2.3.1.1. Paramètres
| nom | requis/optionnel | type de données | description |
|---|---|---|---|
code | requis | string | code d'autorisation à transmettre au token_endpoint. |
state | requis | string (minimum 32 caractères) | <state> communiqué par par le FS dans l'appel au authorization_endpoint. Cette information est à vérifier par le FS, afin d'empêcher l'exploitation de failles CSRF |
NB : le code a une durée d'expiration de 60 secondes.
Votre serveur doit alors effectuer plusieurs actions en "back-channel".
2.3.2. Vérification du state
Vérifier que le champ state récupéré en query parameter correspond bien au state généré précédemment et stocké dans la session du navigateur.
2.3.3. Génération du token
Appeler le endpoint token_endpoint avec les paramètres décrits ci-dessous :
POST https://PROCONNECT_DOMAIN/api/v2/token
2.3.3.1. Description
Implémente le Token Endpoint de Openid Connect:
https://openid.net/specs/openid-connect-core-1_0.html#TokenEndpoint
2.3.3.2. Entête
| nom | requis/optionnel | valeur |
|---|---|---|
Content-Type | requis | application/x-www-form-urlencoded |
2.3.3.3. Body
| nom | requis/optionnel | type de données | description |
|---|---|---|---|
grant_type | requis | string | authorization_code |
client_id | requis | string | <CLIENT_ID> Identifiant du FS, communiqué lors de son inscription auprès de ProConnect |
client_secret | requis | string | <CLIENT_SECRET> Le secret du FS, communiqué lors de son inscription auprès de ProConnect |
redirect_uri | requis | string | <FS_URL>%2F<URL_CALLBACK> Url de retour vers le FS (encodée), communiqué lors de l'appel au Authorization Endpoint |
code | requis | string | <AUTHZ_CODE> code d'autorisation fourni par ProConnect après connexion |
2.3.3.4. Réponses
| code http | content-type | réponse |
|---|---|---|
200 | application/json;charset=utf-8 | La réponse contenant l'access token |
400 | application/json;charset=utf-8 | JSON document décrivant l'origine de l'erreur de format |
2.3.3.5. Format de la réponse en succès
{
'access_token': <ACCESS_TOKEN>,
'token_type': 'Bearer',
'expires_in': 60,
'id_token': <ID_TOKEN>
}Vous récupérez alors un JSON, qui contient notamment :
access_tokenid_token.
L'access_token est un Bearer token. Sa durée de validité est d'une heure.
2.3.4. Vérification de l'id_token et du nonce
L'id_token est un JWT, signé avec l'algorithme spécifié à ProConnect lors de l'enregistrement du FS (RS256, ES256 ou HS256).
Vérifier que le JWT est bien signé avec cet algorithme.
Une fois décodé, extraire le nonce et vérifier qu'il correspond bien au nonce stocké dans la session du navigateur.
2.3.5. Stockage du id_token
Stocker le id_token dans la session du navigateur. Cette valeur sera utilisée plus tard, lors de la déconnexion auprès du serveur ProConnect.
2.3.6. Récupération des user info
Appeler le endpoint userinfo_endpoint, en ajoutant l'access_token token dans l'en-tête Authorization, comme décrit ci-dessous :
GET https://PROCONNECT_DOMAIN/api/v2/userinfo
2.3.6.1. Description
Implémente le UserInfo Endpoint de Openid Connect:
https://openid.net/specs/openid-connect-core-1_0.html#UserInfo
2.3.6.2. Entête
| nom | requis/optionnel | valeur |
|---|---|---|
Authorization | requis | Bearer <access_token> où <access_token> a été communiqué par le Token Endpoint |
2.3.6.3. Paramètres
Aucun
2.3.6.4. Réponses
| code http | content-type | réponse |
|---|---|---|
200 | application/jwt | JSON Web Token signé par l'algorithme spécifié à ProConnect lorsque cela a été spécifié, contenant les claims transmis par le FI |
200 | application/json | JSON contenant les claims transmis par le FI si absence de signature spécifiée |
400 | application/json;charset=utf-8 | JSON document décrivant l'origine de l'erreur de format |
2.3.7. Authentification de l'utilisateur
Le endpoint user_info_endpoint renvoie :
- soit un JSON, si aucun algorithme de signature n'a été spécifié à ProConnect lors de l'enregistrement du Fournisseur de Service
- soit un JWT, signé avec l'algorithme spécifié à ProConnect lors de l'enregistrement du FS (RS256, ES256 ou HS256).
Vérifier que le JWT est bien signé avec cet algorithme.
Une fois en possession des informations de votre utilisateur, vous pouvez gérer comme vous le souhaitez sa session.
NB: la session ProConnect a une durée de 12 heures.
- si vous souhaitez que vos sessions utilisateurs durent plus de 12 heures, c'est possible : lorsque votre session utilisateur sera expirée de votre côté, alors le clic sur le bouton "S'identifier avec ProConnect" renverra bien vers la mire d'authentification car la session ProConnect se sera terminée avant.
- si vous souhaitez que vos sessions utilisateurs durent moins de 12 heures, si votre utilisateur clique sur "S'identifier avec ProConnect" entre la fin de votre session et la fin de celle de ProConnect, il sera automatiquement reconnecté à votre service. Une option
max-ageest décrite dans la spec OIDC et permet de gérer ce cas, mais celle-ci n'est pas encore implémentée sur ProConnect.
2.3.8. Le cas du Silent Login
Il est possible, et plus agréable pour l'utilisateur, de faire en sorte que lorsque l'utilisateur arrive sur votre FS, il se connecte immédiatement et automatiquement à votre FS dans le cas où il dispose d'une session ProConnect en cours (par exemple s'il s'est déjà connecté dans la journée via ProConnect à une autre application). Ce parcours et son implémentation sont décrits à cette page.
2.3.9 Le refresh token
Il est possible d'utiliser un refresh_token pour récupérer des informations utilisateurs auprès de ProConnect (PC) après l'expiration de l'access_token initialement émis lors de la connexion de l'utilisateur. Son implémentation est décrite à cette page
2.4. Déconnexion de l'utilisateur
Au clic sur votre bouton de déconnexion, effectuer les actions suivantes :
2.4.1. Déconnexion auprès de ProConnect
Récupérer l'id_token stocké dans la session du navigateur.
Appeler le endpoint end_session_endpoint avec les paramètres décrits ci-dessous.
GET /api/v2/session/end
2.4.1.1. Description
Implémente le Logout Endpoint de Openid Connect:
http://openid.net/specs/openid-connect-session-1_0.html#RPLogout
⚠ Cet appel doit être réalisé via une redirection dans le navigateur de l'agent, afin d'expirer les cookies de session ProConnect et FI.
2.4.1.2. Paramètres
| nom | requis/optionnel | type de données | description |
|---|---|---|---|
id_token_hint | requis | string | <id_token> contenu dans la réponse du Token Endpoint |
state | requis | string | <state> Champ obligatoire, généré aléatoirement par le FS, que ProConnect renvoie tel quel dans la redirection qui suit la déconnexion, pour être ensuite vérifié par le FS. Il est utilisé afin d'empêcher l'exploitation de failles CSRF |
post_logout_redirect_uri | requis | string | <post_logout_redirect_uri> URL de retour vers le FS, communiquée dans le formulaire Démarches Simplifiées. Attention, cette URL doit être encodée pour être passée en query parameter, doit correspondre exactement à celle communiquée à ProConnect, et est sensible à la présence ou non du / final |
2.4.1.3. Réponses
| code http | content-type | réponse |
|---|---|---|
303 | text/html;charset=UTF-8 | Redirection vers le FI pour déconnexion, puis redirection vers le FS après déconnexion |
2.4.1.4. Exemple d'appel
GET /api/v2/session/end?id_token_hint=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI3MDRlMDI0Mj
I5MDE1ZDJiZDQ3ZjdhNWU1YWIwNWIzNWM4MzM2YWI0MDNjMzgwMjI5ODVmOGNmYWRjODZmZTkxIiwiYW1yIjpbInB3ZCJdLCJ
hdXRoX3RpbWUiOjE2Njg1MzAzMjYsImFjciI6ImVpZGFzMSIsIm5vbmNlIjoiYWZjODFmZGExZmJiNmQzYzg3NmFmNzVjNzM3
YTEzMDdhMWIyOWJhMDg3M2VmYTA1OWU0NTM1ZDEyMmM5ZGI1YSIsImF0X2hhc2giOiJJVEJTV1J2NW1HRmxxTGQ0Sm5nbnRnI
iwiYXVkIjoiNjkyNWZiODE0M2M3NmVkZWQ0NGQzMmI0MGMwY2IxMDA2MDY1ZjdmMDAzZGU1MjcxMmI3ODk4NTcwNGYzOTk1MC
IsImV4cCI6MTY2ODUzMDM4NiwiaWF0IjoxNjY4NTMwMzI2LCJpc3MiOiJodHRwczovL2ZjYS5pbnRlZzAxLmRldi1hZ2VudGN
vbm5lY3QuZnIvYXBpL3YyIn0.hg1n4WJbzZECwz4VldAybXYreEXJ4fxpSWqDs9V4tTk&
state=3b7bd7fb38ccab89864563f17a89c4cb3bd400164ce828b4cfc2cb01ce8ed9da&
post_logout_redirect_uri=https%3A%2F%2Ffsa1v2.integ01.dev-agentconnect.fr%2Flogout-callback HTTP/1.1
Host: fca.integ01.dev-agentconnect.fr2.4.2. Implémentation de la route post_logout_redirect_uri
Il s'agit de la route vers laquelle sera redirigé votre utilisateur après déconnexion par le Fournisseur d'Identité.
Le query parameter renvoyé dans l'URL est décrit ci-dessous.
GET FS_URL/POST_LOGOUT_REDIRECT_URI?state=x
2.4.2.1. Description
Redirection vers le FS après déconnexion.
ProConnect renvoie le state communiqué par le FS lors de la demande de déconnexion.
2.4.2.2. Paramètres
| nom | requis/optionnel | type de données | description |
|---|---|---|---|
state | requis | string (minimum 32 caractères) | <state> communiqué par par le FS dans l'appel au Logout Endpoint. Cette information est à vérifier par le FS, afin d'empêcher l'exploitation de failles CSRF |
2.4.2.3. Exemple d'appel
Exemple de retour vers le FS de mock à déconnexion
GET /logout-callback?state=3b7bd7fb38ccab89864563f17a89c4cb3bd400164ce828b4cfc2cb01ce8ed9da HTTP/1.1
Host: fsa1v2.integ01.dev-agentconnect.fr2.4.3. Vérification du state
Vérifier que le champ state récupéré en query parameter correspond bien au state généré lors de la connexion et stocké dans la session du navigateur.
2.4.4. Suppression des informations de connexion
Supprimer les informations de connexion stockée dans la session du navigateur