From 28cfd127aa2ff8a4b50fa8005629a6bf3c09e294 Mon Sep 17 00:00:00 2001 From: Benjamin Ratti Date: Wed, 26 May 2021 14:42:58 +0200 Subject: [PATCH 01/37] =?UTF-8?q?docs(fs):=20r=C3=A9organisation=20de=20la?= =?UTF-8?q?=20structure?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +++ fs/{docs-fs.md => README.md} | 56 ++++++++++++++++++++------------ fs/devenir-fs.md | 54 ++++++++++++++++++++++++++++++ fs/donnees-usagers.md | 22 +++++++++++++ fs/pilotage-demarches-acteurs.md | 29 +++++++++++++++++ 5 files changed, 145 insertions(+), 21 deletions(-) rename fs/{docs-fs.md => README.md} (90%) create mode 100644 fs/devenir-fs.md create mode 100644 fs/donnees-usagers.md create mode 100644 fs/pilotage-demarches-acteurs.md diff --git a/README.md b/README.md index 71f3885..3ac8581 100644 --- a/README.md +++ b/README.md @@ -1 +1,6 @@ # Documentation-FranceConnect-Plus + +Cette documentation regroupe l'ensemble des informations nécessaire à l'intégration de FranceConnect+, que ce soit en tant que Fournisseur d'identités de FranceConnect+ ou en tant que Fournisseur de services. + +- [documentation Fournisseur d'identités](/fi/docs-fi.md) +- [documentation Fournisseur de services](/fs/docs-fs.md) \ No newline at end of file diff --git a/fs/docs-fs.md b/fs/README.md similarity index 90% rename from fs/docs-fs.md rename to fs/README.md index 6bd28b9..372b773 100644 --- a/fs/docs-fs.md +++ b/fs/README.md @@ -1,26 +1,24 @@ + +Documentation Fournisseur de Service + +--- + # Préambule Cette documentation est à destination des Fournisseurs de Service souhaitant intégrer FranceConnect+. FranceConnect+ met à disposition du Fournisseur de Service des identités de niveau de garantie eIDAS Susbtantiel et Elevé. -FranceConnect+ s'implémente sur une plateforme distincte de la plateforme dite "Standard" qui reste dédiée aux identités de niveau de garantie "faible". +FranceConnect+ s'implémente sur une plateforme distincte de la plateforme FranceConnect qui reste dédiée aux identités de niveau de garantie "faible". # Je veux devenir Fournisseur de Service -## Quelles sont les étapes pour devenir Fournisseur de Service ? - -1. Vous consultez les conditions d'éligibilité à FranceConnect+. Les conditions juridiques, de sécurité et de qualité de service sont détaillées dans nos [conditions générales d'utilisation](https://partenaires.franceconnect.gouv.fr/cgu). Le cadre d'implémentation et d'intégration est détaillé dans nos [spécifications ergonomiques](https://partenaires.franceconnect.gouv.fr/fcp/fournisseur-service#acceptance) **TODO** *mettre à jour le lien* . - -2. Vous soumettez une demande d'habilitation via [datapass.api.gouv.fr](https://datapass.api.gouv.fr/) et vous transmettez toutes les informations nécessaires à la validation de votre demande (respect du RGPD, contact du responsable technique, niveau de garantie eIDAS souhaité, données d'identité recueillies, etc). Votre demande est validée par le service juridique de la DINUM dans un délai moyen de 5 jours ouvrés. - -3. Si votre demande est acceptée, votre responsable technique reçoit un mail lui donnant accès à l'[espace partenaire](https://partenaires.franceconnect.gouv.fr/login). Cet espace vous permettra d'accéder aux ressources de développement et de test. - -4. Vous présentez vos développements pour une qualification par l'équipe FranceConnect+. La durée de cette phase de qualification dépend du [respect des prérequis ](https://partenaires.franceconnect.gouv.fr/monprojet/recetter/)(techniques, sécurité, fonctionnels, UX...). N'hésitez pas à soumettre vos maquettes de parcours en amont pour une pré-qualification fonctionnelle et UX anticipée. +Vous souhaitez devenir Fournisseur de Service pour FranceConnect+, voici les questions à vous poser : -5. Si votre implémentation est validée par notre équipe, vous recevez vos secrets pour passer en production. +* [Quelles sont les étapes pour devenir Fournisseur de Service](devenir-fs.md) +* [Quels sont les différents acteurs que je dois faire intervenir dans mon organisation pour devenir Fournisseur de Service](pilotage-demarches-acteurs.gmd) ## Accès à l'environnement d'intégration FranceConnect+ -Pour vous permettre de réaliser les développements liés à l'intégration de FranceConnect+, nous mettons à disposition un environnement d'intégration. Les accès à cet environnement se font à travers des clés qui vous sont communiquées sur votre espace partenaire. +Pour vous permettre de réaliser les développements liés à l'intégration de FranceConnect, nous mettons à disposition un environnement d'intégration. Les accès à cet environnement se font à travers des clés qui vous sont communiquées sur votre espace partenaire. Sur notre environnement d'intégration, vous pouvez utiliser le fournisseur d'identité "Démonstration" dont les données sont modifiables ici : https://github.com/france-connect/identity-provider-example/blob/master/database.csv @@ -59,7 +57,7 @@ Les adresses de notre environnement de production sont les suivantes : ## Réaliser des tests avant de soumettre sa demande d'habilitation -Un fournisseur de Service de démonstration est disponible à l'adresse [https://fsp1v2.integ01.fcp.fournisseur-de-service.fr/](https://fsp1v2.integ01.fcp.fournisseur-de-service.fr/). +Un fournisseur de Service de démonstration est disponible à l'adresse [fsp1v2.integ01.dev-franceconnect.fr](https://fsp1v2.integ01.dev-franceconnect.fr//). # Concepts de base ## Le protocole OpenID Connect @@ -316,17 +314,33 @@ L'identité pivot complète se récupère soit par le scope identite_pivot, soit * **ID_TOKEN :** Objet JWT retourné par l'appel au endpoint FC_URL/api/21/token. L'objet JWT est un objet JSON formatté et signé. Le JSON doit contenir ces six clés : aud,exp,iat,iss,sub et nonce. -Exemple : +Exemple de JWT : ``` +eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2ZjcC5kb2NrZXIuZGV2LWZyYW5jZWNvbm5lY3QuZnIiLCJzdWIiOiI0ZDMyN2RkMWU0MjdkYWY0ZDUwMjk2YWI3MWQ2ZjNmYzgyY2NjNDA3NDI5NDM1MjFkNDJjYjJiYWU0ZGY0MWFmdjEiLCJhdWQiOiJhMGNkNjQzNzJkYjZlY2YzOWMzMTdjMGM3NGNlOTBmMDJkOGFkN2Q1MTBjZTA1NDg4M2I3NTlkNjY2YTk5NmJjIiwiZXhwIjoxNjE5NjA0NTE4LCJpYXQiOjE2MTk2MDQ0NTgsIm5vbmNlIjoiY3VzdG9tTm9uY2UxMSIsImlkcCI6IkZDIiwiYWNyIjoiZWlkYXMxIiwiYW1yIjpudWxsfQ.AdbcnBJluh1UZb4ylEM6oSoarHw-Cb_4--kFWfOJre4 +``` + +Exemple de header du JWT : +```json +{ + "typ": "JWT", + "alg": "HS256" +} +``` + +Exemple de payload du JWT : + +```json { - 'aud':'895fae591ccae777094931e269e46447', - 'exp':1412953984, - 'iat':1412950384, - 'iss':http://franceconnect.gouv.fr, - 'sub':YWxhY3JpdMOp, - 'idp':'FC', - 'nonce':'12344354597459' + "iss": "https://fcp.docker.dev-franceconnect.fr", + "sub": "4d327dd1e427daf4d50296ab71d6f3fc82ccc40742943521d42cb2bae4df41afv1", + "aud": "a0cd64372db6ecf39c317c0c74ce90f02d8ad7d510ce054883b759d666a996bc", + "exp": 1619604518, + "iat": 1619604458, + "nonce": "customNonce11", + "idp": "FC", + "acr": "eidas1", + "amr": null } ``` Les champs *aud, exp, iat, iss, sub* sont des champs obligatoires de la norme OpenId Connect. Le *nonce* est un paramètre obligatoirement envoyé lors de l'appel à `/authorization`. Le FS doit impérativement vérifier que la valeur correspond bien à celle qu'il a envoyée, et qui doit être liée à la session de l'utilisateur. diff --git a/fs/devenir-fs.md b/fs/devenir-fs.md new file mode 100644 index 0000000..1982739 --- /dev/null +++ b/fs/devenir-fs.md @@ -0,0 +1,54 @@ +[Documentation Fournisseur de Service](README.md) > Devenir Fournisseur de Service FranceConnect+ + +--- + +# Je veux devenir Fournisseur de Service FranceConnect+ + +## Quelles sont les étapes pour devenir Fournisseur de Service ? + +1. Vous consultez les conditions d'éligibilité à FranceConnect. Les conditions juridiques, de sécurité et de qualité de service sont détaillées dans nos [conditions générales d'utilisation](https://partenaires.franceconnect.gouv.fr/cgu). Le cadre d'implémentation et d'intégration est détaillé dans nos [spécifications ergonomiques](https://partenaires.franceconnect.gouv.fr/fcp/fournisseur-service#acceptance) **TODO** *mettre à jour le lien* . + +2. Vous soumettez une demande d'habilitation via [datapass.api.gouv.fr](https://datapass.api.gouv.fr/) et vous transmettez toutes les informations nécessaires à la validation de votre demande (respect du RGPD, contact du responsable technique, niveau de garantie eIDAS souhaité, données d'identité recueillies, etc). Votre demande est validée par le service juridique de la DINUM dans un délai moyen de 5 jours ouvrés. + +3. ~~Si votre demande est acceptée, votre responsable technique reçoit un mail lui donnant accès à l'[espace partenaire](https://partenaires.franceconnect.gouv.fr/login). Cet espace vous permettra d'accéder aux ressources de développement et de test~~. + +*Actuellement, notre espace partenaire n'est pas disponible pour FranceConnect+, pour cela, nous vous invitons à vous rapprocher du support partenaire pour accéder à vos ressources de développement et de test FranceConnect+* + +4. Vous présentez vos développements pour une qualification par l'équipe FranceConnect. La durée de cette phase de qualification dépend du [respect des prérequis ](https://partenaires.franceconnect.gouv.fr/monprojet/recetter/)(techniques, sécurité, fonctionnels, UX...). N'hésitez pas à soumettre vos maquettes de parcours en amont pour une pré-qualification fonctionnelle et UX anticipée. + +5. Si votre implémentation est validée par notre équipe, vous recevez vos secrets pour passer en production. + +## Quels sont les différences entre FranceConnect et FranceConnect+ + +La principale différences entre FranceConnect et FranceConnect+ est le niveau de garantie eIDAS supporté par la plateforme. Pour rappel, le règlement eIDAS prévoit trois niveau de garantie : + +> - Faible : à ce niveau, l’objectif est simplement de réduire le risque d’utilisation abusive ou d’altération de l’identité ; +> - Substantiel : à ce niveau, l’objectif est de réduire substantiellement le risque d’utilisation abusive ou d’altération de l’identité ; +> - Élevé : à ce niveau, l’objectif est d’empêcher l’utilisation abusive ou l’altération de l’identité. + +[[plus d'infos](https://www.ssi.gouv.fr/administration/reglementation/confiance-numerique/le-reglement-eidas/)] + + +La plateforme FranceConnect supporte uniquement le niveau de garantie faible. C'est la plateforme FranceConnect+ qui assurent les niveaux de garantie supérieur, c'est à dire les niveaux de garantie Substantiel et Élevé. + + +## Je suis déjà Fournisseur de Service pour FranceConnect, que dois je faire en plus pour devenir Fournisseur de Service pour FranceConnect+ ? + +FranceConnect+ étant une plateforme différente de FranceConnect, il est nécessaire de réaliser une intégration de FranceConnect+, en complément de l'intégration de FranceConnect. Vous devez donc suivre l'ensemble des étapes pour devenir Fournisseur de Service. + +L'intégration de FranceConnect+ en tant que Fournisseur de Service est légèrement différente de celle de FranceConnect car elle nécessite des mesures de sécurités supplémentaires afin de répondre à des exigences de sécurité spécifiques aux niveaux de garantie subtantiel et élevé. Vos équipes de développement devront par conséquent réaliser des évolutions pour pouvoir s'intégrer à FranceConnect+. Les différences principales par rapport à FranceConnect sont les suivants: + +- une plateforme différente, donc + - des URLs différentes pour accéder aux environnements; + - des secrets différents pour chacun des environnements (intégration, production) +- un chiffrement et un signature sur les jetons transmis +- une utilisation de mode discovery d'OpenId Connect +- une exposition des clés publiques de chiffrement et de signature + + +Les plateformes FranceConnect et FranceConnect+ reposent toutes les deux sur le même protocole, à savoir OpenId Connect. Hormis les différences cités ci dessus, leur fonctionnement est similaire. Ainsi les intégrations de FranceConnect et FranceConnect+ sont très similaire et ne nécessite pas pour un Fournisseur de Service une charge d'intégration important pour devenir Fournisseur de Service pour FranceConnect+ si vous l'êtes déjà pour FranceConnect. + +--- + +Pages similaires : +- [Acteurs à impliquer](pilotage-demarches-acteurs.md) diff --git a/fs/donnees-usagers.md b/fs/donnees-usagers.md new file mode 100644 index 0000000..da61f41 --- /dev/null +++ b/fs/donnees-usagers.md @@ -0,0 +1,22 @@ +# Les données usagers +Les données usagers sont fournies par les Fournisseurs d'Identité aux Fournisseurs de Service, via FranceConnect, conformément à l'habilitation obtenue via [datapass.api.gouv.fr](https://datapass.api.gouv.fr), et le choix des données réalisé par le fournisseur de service dans cette demande. + +L'identité pivot permet d'identifier un utilisateur particulier. + +* Nom de naissance +* Prénoms +* Sexe +* Date de naissance +* Code géographique INSEE de la ville de naissance +* Code géographique INSEE du pays de naissance + +En complément, il est possible d'obtenir le nom d'usage. Cependant cette donnée n'est pas obligatoirement connue par tous les Fournisseurs d'Identité. + +Vous pouvez avoir accès également à l'adresse email. Cette donnée de contact a également été vérifiée par le Fournisseur d'identité. Il est à remarquer que la donnée "adresse email" peut différer selon le Fournisseur d'Identité choisi par l'usager. + +FranceConnect transmet systématiquement au Fournisseur de Service un identifiant unique pour chaque utilisateur : + +* Cet identifiant est spécifique à chaque Fournisseur de Service. Un même utilisateur aura donc un identifiant unique différent pour chacun des Fournisseurs de Service auxquels il accède. +* Cet identifiant est le même quelque soit le Fournisseur d'Identité qui est utilisé par l'utilisateur. + +A noter que pour les niveaux de garantie d'identité eIDAS 2 et 3 (substantiel et élevé), les données d'identité fournies au fournisseur de service sont celles directement issues du fournisseur d'identité choisi par l'utilisateur, sans redressement RNIPP (INSEE). Ces données peuvent donc légèrement varier d'un fournisseur d'identité à l'autre, nous préconisons donc de réaliser le rapprochement/réconciliation sur la base de l'identifiant unique de l'utilisateur fourni par FranceConnect. \ No newline at end of file diff --git a/fs/pilotage-demarches-acteurs.md b/fs/pilotage-demarches-acteurs.md new file mode 100644 index 0000000..1d9a66b --- /dev/null +++ b/fs/pilotage-demarches-acteurs.md @@ -0,0 +1,29 @@ +# Les acteurs à impliquer dans l'intégration de FranceConnect+ + +Pour devenir Fournisseur de Service de FranceConnect+, il est nécessaire de designé des personnes remplissants les rôles suivants : Responsable de traitement, Délégué à la protection des données, Responsable technique, Responsable de la Sécurité du Système d'Information. + +Il vous sera demandé lors de la demande d'habilitation à FranceConnec+ d'identifier les personnes ayant ces responsabilités. + + +## Responsable de traitement + +Le responsable du traitement des données est la personne physique ou morale qui, seul ou conjointement avec d’autres, détermine les finalités et les moyens du traitement des données à caractère personnel. Seule une personne appartenant à l’organisme demandeur peut être renseignée. ([plus d’infos](https://www.cnil.fr/fr/definition/responsable-de-traitement)) + +## Délégué à la protection des données + +C'est la personne qui s’assure que l’organisation protège convenablement les données à caractère personnel, conformément à la législation en vigueur. C'est généralement une personne appartenant à l’organisme demandeur. ([plus d’infos](https://www.cnil.fr/fr/designation-dpo)) + +## Responsable technique + +C'est la personne qui est reponsable de la mise en oeuvre du fournisseur de service de FranceConnect+. Cette personne recevra les accès techniques par mail. Le numéro de téléphone doit être un numéro de téléphone mobile. Il sera utilisé pour envoyer un code d’accès. Le responsable technique peut être le contact technique de votre prestataire. + +## Responsable de la Sécurité du Système d'Information + +Le Responsable de la sécurité des systèmes d’information (RSSI) +assure le pilotage de la démarche de cybersécurité sur un périmètre +organisationnel et/ou géographique au sein de l’organisation. Il définit +ou décline, selon la taille de l’organisation, la politique de sécurité des +systèmes d’information (prévention, protection, détection, résilience, +remédiation) et veille à son application. Il assure un rôle de conseil, +d’assistance, d’information, de formation et d’alerte, en particulier +auprès des directeurs métiers et/ou de la direction de son périmètre. \ No newline at end of file From 24a96f9bac0cbe7c806bb6da8b70ad9c4273a670 Mon Sep 17 00:00:00 2001 From: Benjamin Ratti Date: Wed, 26 May 2021 15:26:01 +0200 Subject: [PATCH 02/37] refactor(fs): reorganisation de la documentation devenir un fs --- fs/README.md | 9 +++- fs/devenir-fs.md | 54 ------------------- .../pilotage-demarches-acteurs.md | 13 ++++- fs/pilotage/pilotage-differences-fc-fc+.md | 16 ++++++ fs/pilotage/pilotage-etapes.md | 26 +++++++++ fs/pilotage/pilotage-integrer-fc+-apres-fc.md | 19 +++++++ 6 files changed, 80 insertions(+), 57 deletions(-) delete mode 100644 fs/devenir-fs.md rename fs/{ => pilotage}/pilotage-demarches-acteurs.md (82%) create mode 100644 fs/pilotage/pilotage-differences-fc-fc+.md create mode 100644 fs/pilotage/pilotage-etapes.md create mode 100644 fs/pilotage/pilotage-integrer-fc+-apres-fc.md diff --git a/fs/README.md b/fs/README.md index 372b773..c05ec6b 100644 --- a/fs/README.md +++ b/fs/README.md @@ -3,6 +3,8 @@ Documentation Fournisseur de Service --- +Vous souhaitez implémenter FranceConnect+ sur votre site? Vous êtes au bon endroit ! Cette documentation présente l'ensemble des informations à connaitre sur FranceConnect+ + # Préambule Cette documentation est à destination des Fournisseurs de Service souhaitant intégrer FranceConnect+. @@ -13,8 +15,11 @@ FranceConnect+ s'implémente sur une plateforme distincte de la plateforme Franc Vous souhaitez devenir Fournisseur de Service pour FranceConnect+, voici les questions à vous poser : -* [Quelles sont les étapes pour devenir Fournisseur de Service](devenir-fs.md) -* [Quels sont les différents acteurs que je dois faire intervenir dans mon organisation pour devenir Fournisseur de Service](pilotage-demarches-acteurs.gmd) +* [Quelles sont les étapes pour devenir Fournisseur de Service ?](pilotage/pilotage-etapes.md) +* [Quels sont les différents acteurs que je dois faire intervenir dans mon organisation pour devenir Fournisseur de Service ?](pilotage/pilotage-demarches-acteurs.md) +* [Quelles sont les différences entre FranceConnect et FranceConnect+ ?](pilotage/pilotage-differences-fc-fc+.md) +* [Je suis déjà Fournisseur de Service pour FranceConnect, que dois je faire en plus pour devenir Fournisseur de Service pour FranceConnect+ ?](pilotage/pilotage-integrer-fc+-apres-fc.md) + ## Accès à l'environnement d'intégration FranceConnect+ diff --git a/fs/devenir-fs.md b/fs/devenir-fs.md deleted file mode 100644 index 1982739..0000000 --- a/fs/devenir-fs.md +++ /dev/null @@ -1,54 +0,0 @@ -[Documentation Fournisseur de Service](README.md) > Devenir Fournisseur de Service FranceConnect+ - ---- - -# Je veux devenir Fournisseur de Service FranceConnect+ - -## Quelles sont les étapes pour devenir Fournisseur de Service ? - -1. Vous consultez les conditions d'éligibilité à FranceConnect. Les conditions juridiques, de sécurité et de qualité de service sont détaillées dans nos [conditions générales d'utilisation](https://partenaires.franceconnect.gouv.fr/cgu). Le cadre d'implémentation et d'intégration est détaillé dans nos [spécifications ergonomiques](https://partenaires.franceconnect.gouv.fr/fcp/fournisseur-service#acceptance) **TODO** *mettre à jour le lien* . - -2. Vous soumettez une demande d'habilitation via [datapass.api.gouv.fr](https://datapass.api.gouv.fr/) et vous transmettez toutes les informations nécessaires à la validation de votre demande (respect du RGPD, contact du responsable technique, niveau de garantie eIDAS souhaité, données d'identité recueillies, etc). Votre demande est validée par le service juridique de la DINUM dans un délai moyen de 5 jours ouvrés. - -3. ~~Si votre demande est acceptée, votre responsable technique reçoit un mail lui donnant accès à l'[espace partenaire](https://partenaires.franceconnect.gouv.fr/login). Cet espace vous permettra d'accéder aux ressources de développement et de test~~. - -*Actuellement, notre espace partenaire n'est pas disponible pour FranceConnect+, pour cela, nous vous invitons à vous rapprocher du support partenaire pour accéder à vos ressources de développement et de test FranceConnect+* - -4. Vous présentez vos développements pour une qualification par l'équipe FranceConnect. La durée de cette phase de qualification dépend du [respect des prérequis ](https://partenaires.franceconnect.gouv.fr/monprojet/recetter/)(techniques, sécurité, fonctionnels, UX...). N'hésitez pas à soumettre vos maquettes de parcours en amont pour une pré-qualification fonctionnelle et UX anticipée. - -5. Si votre implémentation est validée par notre équipe, vous recevez vos secrets pour passer en production. - -## Quels sont les différences entre FranceConnect et FranceConnect+ - -La principale différences entre FranceConnect et FranceConnect+ est le niveau de garantie eIDAS supporté par la plateforme. Pour rappel, le règlement eIDAS prévoit trois niveau de garantie : - -> - Faible : à ce niveau, l’objectif est simplement de réduire le risque d’utilisation abusive ou d’altération de l’identité ; -> - Substantiel : à ce niveau, l’objectif est de réduire substantiellement le risque d’utilisation abusive ou d’altération de l’identité ; -> - Élevé : à ce niveau, l’objectif est d’empêcher l’utilisation abusive ou l’altération de l’identité. - -[[plus d'infos](https://www.ssi.gouv.fr/administration/reglementation/confiance-numerique/le-reglement-eidas/)] - - -La plateforme FranceConnect supporte uniquement le niveau de garantie faible. C'est la plateforme FranceConnect+ qui assurent les niveaux de garantie supérieur, c'est à dire les niveaux de garantie Substantiel et Élevé. - - -## Je suis déjà Fournisseur de Service pour FranceConnect, que dois je faire en plus pour devenir Fournisseur de Service pour FranceConnect+ ? - -FranceConnect+ étant une plateforme différente de FranceConnect, il est nécessaire de réaliser une intégration de FranceConnect+, en complément de l'intégration de FranceConnect. Vous devez donc suivre l'ensemble des étapes pour devenir Fournisseur de Service. - -L'intégration de FranceConnect+ en tant que Fournisseur de Service est légèrement différente de celle de FranceConnect car elle nécessite des mesures de sécurités supplémentaires afin de répondre à des exigences de sécurité spécifiques aux niveaux de garantie subtantiel et élevé. Vos équipes de développement devront par conséquent réaliser des évolutions pour pouvoir s'intégrer à FranceConnect+. Les différences principales par rapport à FranceConnect sont les suivants: - -- une plateforme différente, donc - - des URLs différentes pour accéder aux environnements; - - des secrets différents pour chacun des environnements (intégration, production) -- un chiffrement et un signature sur les jetons transmis -- une utilisation de mode discovery d'OpenId Connect -- une exposition des clés publiques de chiffrement et de signature - - -Les plateformes FranceConnect et FranceConnect+ reposent toutes les deux sur le même protocole, à savoir OpenId Connect. Hormis les différences cités ci dessus, leur fonctionnement est similaire. Ainsi les intégrations de FranceConnect et FranceConnect+ sont très similaire et ne nécessite pas pour un Fournisseur de Service une charge d'intégration important pour devenir Fournisseur de Service pour FranceConnect+ si vous l'êtes déjà pour FranceConnect. - ---- - -Pages similaires : -- [Acteurs à impliquer](pilotage-demarches-acteurs.md) diff --git a/fs/pilotage-demarches-acteurs.md b/fs/pilotage/pilotage-demarches-acteurs.md similarity index 82% rename from fs/pilotage-demarches-acteurs.md rename to fs/pilotage/pilotage-demarches-acteurs.md index 1d9a66b..9545d69 100644 --- a/fs/pilotage-demarches-acteurs.md +++ b/fs/pilotage/pilotage-demarches-acteurs.md @@ -1,9 +1,20 @@ -# Les acteurs à impliquer dans l'intégration de FranceConnect+ +[Documentation Fournisseur de Service](README.md) > [Devenir Fournisseur de Service FranceConnect+](../README.md#je-veux-devenir-fournisseur-de-service) > Acteurs à impliquer + +--- + +# Quels sont les acteurs à impliquer dans l'intégration de FranceConnect+ Pour devenir Fournisseur de Service de FranceConnect+, il est nécessaire de designé des personnes remplissants les rôles suivants : Responsable de traitement, Délégué à la protection des données, Responsable technique, Responsable de la Sécurité du Système d'Information. Il vous sera demandé lors de la demande d'habilitation à FranceConnec+ d'identifier les personnes ayant ces responsabilités. +Les acteurs à impliquer sont les suivants : + +- Le responsable de traitement +- le délégué à la protection des données +- le responsable technique +- le responsable de la sécurité dur système d'information + ## Responsable de traitement diff --git a/fs/pilotage/pilotage-differences-fc-fc+.md b/fs/pilotage/pilotage-differences-fc-fc+.md new file mode 100644 index 0000000..473d131 --- /dev/null +++ b/fs/pilotage/pilotage-differences-fc-fc+.md @@ -0,0 +1,16 @@ +[Documentation Fournisseur de Service](README.md) > [Devenir Fournisseur de Service FranceConnect+](../README.md#je-veux-devenir-fournisseur-de-service) > Différences entre FranceConnect et FranceConnect+ + +--- + +# Quelles sont les différences entre FranceConnect et FranceConnect+ ? + +La principale différences entre FranceConnect et FranceConnect+ est le niveau de garantie eIDAS supporté par la plateforme. Pour rappel, le règlement eIDAS prévoit trois niveau de garantie : + +> - Faible : à ce niveau, l’objectif est simplement de réduire le risque d’utilisation abusive ou d’altération de l’identité ; +> - Substantiel : à ce niveau, l’objectif est de réduire substantiellement le risque d’utilisation abusive ou d’altération de l’identité ; +> - Élevé : à ce niveau, l’objectif est d’empêcher l’utilisation abusive ou l’altération de l’identité. + +[[plus d'infos](https://www.ssi.gouv.fr/administration/reglementation/confiance-numerique/le-reglement-eidas/)] + + +La plateforme FranceConnect supporte uniquement le niveau de garantie faible. C'est la plateforme FranceConnect+ qui assurent les niveaux de garantie supérieur, c'est à dire les niveaux de garantie Substantiel et Élevé. diff --git a/fs/pilotage/pilotage-etapes.md b/fs/pilotage/pilotage-etapes.md new file mode 100644 index 0000000..70d36fe --- /dev/null +++ b/fs/pilotage/pilotage-etapes.md @@ -0,0 +1,26 @@ +[Documentation Fournisseur de Service](README.md) > [Devenir Fournisseur de Service FranceConnect+](../README.md#je-veux-devenir-fournisseur-de-service) > Etapes pour devenir FS + +--- + +# Quelles sont les étapes pour devenir Fournisseur de Service ? + +1. Vous consultez les conditions d'éligibilité à FranceConnect. Les conditions juridiques, de sécurité et de qualité de service sont détaillées dans nos [conditions générales d'utilisation](https://partenaires.franceconnect.gouv.fr/cgu). Le cadre d'implémentation et d'intégration est détaillé dans nos [spécifications ergonomiques](https://partenaires.franceconnect.gouv.fr/fcp/fournisseur-service#acceptance) **TODO** *mettre à jour le lien* . + +2. Vous soumettez une demande d'habilitation via [datapass.api.gouv.fr](https://datapass.api.gouv.fr/) et vous transmettez toutes les informations nécessaires à la validation de votre demande (respect du RGPD, contact du responsable technique, niveau de garantie eIDAS souhaité, données d'identité recueillies, etc). Votre demande est validée par le service juridique de la DINUM dans un délai moyen de 5 jours ouvrés. + +3. ~~Si votre demande est acceptée, votre responsable technique reçoit un mail lui donnant accès à l'[espace partenaire](https://partenaires.franceconnect.gouv.fr/login). Cet espace vous permettra d'accéder aux ressources de développement et de test~~. + +*Actuellement, notre espace partenaire n'est pas disponible pour FranceConnect+, pour cela, nous vous invitons à vous rapprocher du support partenaire pour accéder à vos ressources de développement et de test FranceConnect+* + +4. Vous présentez vos développements pour une qualification par l'équipe FranceConnect. La durée de cette phase de qualification dépend du [respect des prérequis ](https://partenaires.franceconnect.gouv.fr/monprojet/recetter/)(techniques, sécurité, fonctionnels, UX...). N'hésitez pas à soumettre vos maquettes de parcours en amont pour une pré-qualification fonctionnelle et UX anticipée. + +5. Si votre implémentation est validée par notre équipe, vous recevez vos secrets pour passer en production. + + + + + +--- + +Voir aussi : +- [Acteurs à impliquer](pilotage-demarches-acteurs.md) diff --git a/fs/pilotage/pilotage-integrer-fc+-apres-fc.md b/fs/pilotage/pilotage-integrer-fc+-apres-fc.md new file mode 100644 index 0000000..88ba7b3 --- /dev/null +++ b/fs/pilotage/pilotage-integrer-fc+-apres-fc.md @@ -0,0 +1,19 @@ +[Documentation Fournisseur de Service](README.md) > [Devenir Fournisseur de Service FranceConnect+](../README.md#je-veux-devenir-fournisseur-de-service) > Intégrer FranceConnect+ lorsque je suis déjà Fournisseur de Service pour FranceConnect + +--- + +# Je suis déjà Fournisseur de Service pour FranceConnect, que dois je faire en plus pour devenir Fournisseur de Service pour FranceConnect+ ? + +FranceConnect+ étant une plateforme différente de FranceConnect, il est nécessaire de réaliser une intégration de FranceConnect+, en complément de l'intégration de FranceConnect. Vous devez donc suivre l'ensemble des étapes pour devenir Fournisseur de Service. + +L'intégration de FranceConnect+ en tant que Fournisseur de Service est légèrement différente de celle de FranceConnect car elle nécessite des mesures de sécurités supplémentaires afin de répondre à des exigences de sécurité spécifiques aux niveaux de garantie subtantiel et élevé. Vos équipes de développement devront par conséquent réaliser des évolutions pour pouvoir s'intégrer à FranceConnect+. Les différences principales par rapport à FranceConnect sont les suivants: + +- une plateforme différente, donc + - des URLs différentes pour accéder aux environnements; + - des secrets différents pour chacun des environnements (intégration, production) +- un chiffrement et un signature sur les jetons transmis +- une utilisation de mode discovery d'OpenId Connect +- une exposition des clés publiques de chiffrement et de signature + + +Les plateformes FranceConnect et FranceConnect+ reposent toutes les deux sur le même protocole, à savoir OpenId Connect. Hormis les différences cités ci dessus, leur fonctionnement est similaire. Ainsi les intégrations de FranceConnect et FranceConnect+ sont très similaire et ne nécessite pas pour un Fournisseur de Service une charge d'intégration important pour devenir Fournisseur de Service pour FranceConnect+ si vous l'êtes déjà pour FranceConnect. \ No newline at end of file From 1c70830e1ff530ace2dbdb718024f16a6fdc9397 Mon Sep 17 00:00:00 2001 From: Benjamin Ratti Date: Wed, 26 May 2021 18:46:22 +0200 Subject: [PATCH 03/37] =?UTF-8?q?feat(fs):=20ajout=20de=20la=20documentati?= =?UTF-8?q?on=20sur=20les=20donn=C3=A9es=20accessible=20via=20FC+?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fs/README.md | 10 +++++++ fs/pilotage/pilotage-demarches-acteurs.md | 2 +- fs/pilotage/pilotage-differences-fc-fc+.md | 2 +- fs/pilotage/pilotage-etapes.md | 2 +- fs/pilotage/pilotage-integrer-fc+-apres-fc.md | 2 +- fs/projet/projet-donnees-fc+.md | 27 +++++++++++++++++++ fs/projet/projet-ecosysteme-fc+.md | 0 fs/projet/projet-niveau-eidas.md | 0 8 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 fs/projet/projet-donnees-fc+.md create mode 100644 fs/projet/projet-ecosysteme-fc+.md create mode 100644 fs/projet/projet-niveau-eidas.md diff --git a/fs/README.md b/fs/README.md index c05ec6b..2f3dfce 100644 --- a/fs/README.md +++ b/fs/README.md @@ -21,6 +21,16 @@ Vous souhaitez devenir Fournisseur de Service pour FranceConnect+, voici les que * [Je suis déjà Fournisseur de Service pour FranceConnect, que dois je faire en plus pour devenir Fournisseur de Service pour FranceConnect+ ?](pilotage/pilotage-integrer-fc+-apres-fc.md) +# Je gère un projet d'intégration de FranceConnect+ + +Vous avez lancé un projet pour devenir FranceConnect+ et vous souhaiter connaitre les différentes problématique d'intégration de FranceConnect+, voici les questions à vous poser : + +## Je souhaite savoir comment fonctionnement FranceConnect+ + +- [Quelles sont les données que je peux récupérer par FranceConnect+ sur mes usagers ?](projet/projet-donnees-fc+.md) +- [Qu'est ce qu'eIDAS et quels sont les niveaux de garantie de FranceConnect+ ?](projet/projet-niveau-eidas.md) +- [Quel est l'écosystème de FranceConnect+ ?](projet/projet-ecosysteme-fc+.md) + ## Accès à l'environnement d'intégration FranceConnect+ Pour vous permettre de réaliser les développements liés à l'intégration de FranceConnect, nous mettons à disposition un environnement d'intégration. Les accès à cet environnement se font à travers des clés qui vous sont communiquées sur votre espace partenaire. diff --git a/fs/pilotage/pilotage-demarches-acteurs.md b/fs/pilotage/pilotage-demarches-acteurs.md index 9545d69..16b224e 100644 --- a/fs/pilotage/pilotage-demarches-acteurs.md +++ b/fs/pilotage/pilotage-demarches-acteurs.md @@ -1,4 +1,4 @@ -[Documentation Fournisseur de Service](README.md) > [Devenir Fournisseur de Service FranceConnect+](../README.md#je-veux-devenir-fournisseur-de-service) > Acteurs à impliquer +[Documentation Fournisseur de Service](README.md) > [Devenir Fournisseur de Service FranceConnect+](../../README.md#je-veux-devenir-fournisseur-de-service) > Acteurs à impliquer --- diff --git a/fs/pilotage/pilotage-differences-fc-fc+.md b/fs/pilotage/pilotage-differences-fc-fc+.md index 473d131..1cf719c 100644 --- a/fs/pilotage/pilotage-differences-fc-fc+.md +++ b/fs/pilotage/pilotage-differences-fc-fc+.md @@ -1,4 +1,4 @@ -[Documentation Fournisseur de Service](README.md) > [Devenir Fournisseur de Service FranceConnect+](../README.md#je-veux-devenir-fournisseur-de-service) > Différences entre FranceConnect et FranceConnect+ +[Documentation Fournisseur de Service](README.md) > [Devenir Fournisseur de Service FranceConnect+](../../README.md#je-veux-devenir-fournisseur-de-service) > Différences entre FranceConnect et FranceConnect+ --- diff --git a/fs/pilotage/pilotage-etapes.md b/fs/pilotage/pilotage-etapes.md index 70d36fe..64a393d 100644 --- a/fs/pilotage/pilotage-etapes.md +++ b/fs/pilotage/pilotage-etapes.md @@ -1,4 +1,4 @@ -[Documentation Fournisseur de Service](README.md) > [Devenir Fournisseur de Service FranceConnect+](../README.md#je-veux-devenir-fournisseur-de-service) > Etapes pour devenir FS +[Documentation Fournisseur de Service](../README.md) > [Devenir Fournisseur de Service FranceConnect+](../../README.md#je-veux-devenir-fournisseur-de-service) > Etapes pour devenir FS --- diff --git a/fs/pilotage/pilotage-integrer-fc+-apres-fc.md b/fs/pilotage/pilotage-integrer-fc+-apres-fc.md index 88ba7b3..664ed95 100644 --- a/fs/pilotage/pilotage-integrer-fc+-apres-fc.md +++ b/fs/pilotage/pilotage-integrer-fc+-apres-fc.md @@ -1,4 +1,4 @@ -[Documentation Fournisseur de Service](README.md) > [Devenir Fournisseur de Service FranceConnect+](../README.md#je-veux-devenir-fournisseur-de-service) > Intégrer FranceConnect+ lorsque je suis déjà Fournisseur de Service pour FranceConnect +[Documentation Fournisseur de Service](../../README.md) > [Devenir Fournisseur de Service FranceConnect+](../../README.md#je-veux-devenir-fournisseur-de-service) > Intégrer FranceConnect+ lorsque je suis déjà Fournisseur de Service pour FranceConnect --- diff --git a/fs/projet/projet-donnees-fc+.md b/fs/projet/projet-donnees-fc+.md new file mode 100644 index 0000000..b836b51 --- /dev/null +++ b/fs/projet/projet-donnees-fc+.md @@ -0,0 +1,27 @@ +[Documentation Fournisseur de Service](../README.md) > [Gerer un projet d'integration FranceConnect+](../README.md#je-veux-devenir-fournisseur-de-service) > Données accessible via FranceConnect+ + +--- + +# je veux connaitre les données que je peux récupérer de FranceConnect+ + +Les données usagers sont fournies par les Fournisseurs d'Identité aux Fournisseurs de Service, via FranceConnect+, conformément à l'habilitation obtenue via [datapass.api.gouv.fr](https://datapass.api.gouv.fr), et le choix des données réalisé par le fournisseur de service dans cette demande. + +L'identité pivot permet d'identifier un utilisateur particulier. + +* Nom de naissance +* Prénoms +* Sexe +* Date de naissance +* Code géographique INSEE de la ville de naissance +* Code géographique INSEE du pays de naissance + +En complément, il est possible d'obtenir le nom d'usage. Cependant cette donnée n'est pas obligatoirement connue par tous les Fournisseurs d'Identité. Cette donnée ne sera donc pas transmise systématiquement si vous la demandez. + +Vous pouvez avoir accès également à l'adresse email. Cette donnée de contact a également été vérifiée par le Fournisseur d'identité. Il est à remarquer que la donnée "adresse email" peut différer selon le Fournisseur d'Identité choisi par l'usager. + +FranceConnect+ transmet systématiquement au Fournisseur de Service un identifiant unique pour chaque utilisateur : + +* Cet identifiant est spécifique à chaque Fournisseur de Service. Un même utilisateur aura donc un identifiant unique différent pour chacun des Fournisseurs de Service auxquels il accède. +* Cet identifiant est le même quelque soit le Fournisseur d'Identité qui est utilisé par l'utilisateur. + +Les données d'identité fournies au fournisseur de service sont celles directement issues du fournisseur d'identité choisi par l'utilisateur. Ces données peuvent donc légèrement varier d'un fournisseur d'identité à l'autre, nous préconisons donc de réaliser le rapprochement/réconciliation sur la base de l'identifiant unique de l'utilisateur fourni par FranceConnect+. \ No newline at end of file diff --git a/fs/projet/projet-ecosysteme-fc+.md b/fs/projet/projet-ecosysteme-fc+.md new file mode 100644 index 0000000..e69de29 diff --git a/fs/projet/projet-niveau-eidas.md b/fs/projet/projet-niveau-eidas.md new file mode 100644 index 0000000..e69de29 From b2cdcca9dfc45834b6795813c224cca770bd3bfe Mon Sep 17 00:00:00 2001 From: Benjamin Ratti Date: Thu, 27 May 2021 09:43:51 +0200 Subject: [PATCH 04/37] =?UTF-8?q?docs(fs)=20:=20ajout=20des=20r=C3=A9perto?= =?UTF-8?q?ires=20integ=20/=20projet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fs/integration/integration-oidc.md | 24 ++++++++++++++++++++++++ fs/projet/projet-donnees-fc+.md | 1 + fs/projet/projet-niveau-eidas.md | 6 ++++++ 3 files changed, 31 insertions(+) create mode 100644 fs/integration/integration-oidc.md diff --git a/fs/integration/integration-oidc.md b/fs/integration/integration-oidc.md new file mode 100644 index 0000000..a7fe4f6 --- /dev/null +++ b/fs/integration/integration-oidc.md @@ -0,0 +1,24 @@ + + +--- + +# Qu'est ce que le protocole OpenID Connect +## Introduction + +Le protocole OpenID Connect est au cœur du fonctionnement de FranceConnect+. C'est une couche d'identification basée sur protocole OAuth 2.0. Il permet à des Clients (ici, les Fournisseur de Service) d'accéder à l'identité des Utilisateurs finaux (les internautes) par l'intermédiaire d'un serveur d'autorisation (ici, les Fournisseurs d'Identité). + +La spécification du protocole se trouve sur http://openid.net/connect/. + +Pour une référence d'implémentation OpenID Connect voici le lien : https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowAuth + +## Les flux standards + +Le protocole OpenID Connect définit 3 appels REST faits par le client, et 4 endpoints (un du côté client, et trois du côté provider). + +En amont, le client s'inscrit (en général manuellement) auprès du provider. Il lui fournit une URL de callback (l'URL du client vers lequel l'internaute est redirigé une fois authentifié), aussi appelée "callback endpoint". En retour le provider donne au client un client ID et un client secret. + +Lorsque l'internaute clique sur le bouton d'authentification du client, le flux est le suivant : + +1. Le client fait une redirection vers le "authorization endpoint" du provider avec son client id et son url de callback. Le provider redirige alors l'internaute vers sa mire d'authentification. Si l'internaute se loggue correctement, le provider renvoie un code d'autorisation au client. +2. Le client fait un appel Web service vers le "token endpoint" du provider avec le code d'autorisation reçu, et authentifie cette requête avec son client id et son client secret. Le provider retourne un access token (une chaîne de caractères encodée en base64), un id token (sous la forme d'un Json Web Token), et parfois un refresh token (une chaîne de caractères en base64). +3. Le client fait un appel Web service vers le "userInfo endpoint" du provider avec l'access token reçu, et le provider renvoie les informations de l'internaute au client. \ No newline at end of file diff --git a/fs/projet/projet-donnees-fc+.md b/fs/projet/projet-donnees-fc+.md index b836b51..230954c 100644 --- a/fs/projet/projet-donnees-fc+.md +++ b/fs/projet/projet-donnees-fc+.md @@ -23,5 +23,6 @@ FranceConnect+ transmet systématiquement au Fournisseur de Service un identifia * Cet identifiant est spécifique à chaque Fournisseur de Service. Un même utilisateur aura donc un identifiant unique différent pour chacun des Fournisseurs de Service auxquels il accède. * Cet identifiant est le même quelque soit le Fournisseur d'Identité qui est utilisé par l'utilisateur. +* Cet identifiant n'est amené à changer quand dans le cas particulier où l'utilisateur a fait modifié ses données d'état civil. Dans tous les autres cas, cet identifiant sera systématiquement le même. Les données d'identité fournies au fournisseur de service sont celles directement issues du fournisseur d'identité choisi par l'utilisateur. Ces données peuvent donc légèrement varier d'un fournisseur d'identité à l'autre, nous préconisons donc de réaliser le rapprochement/réconciliation sur la base de l'identifiant unique de l'utilisateur fourni par FranceConnect+. \ No newline at end of file diff --git a/fs/projet/projet-niveau-eidas.md b/fs/projet/projet-niveau-eidas.md index e69de29..b6ef6f3 100644 --- a/fs/projet/projet-niveau-eidas.md +++ b/fs/projet/projet-niveau-eidas.md @@ -0,0 +1,6 @@ +[Documentation Fournisseur de Service](../README.md) > [Gerer un projet d'integration FranceConnect+](../README.md#je-veux-devenir-fournisseur-de-service) > Données accessible via FranceConnect+ + +--- + +# Qu'est ce qu'eIDAS et quels sont les niveaux de garantie de FranceConnect+ ? + From 991694a5a4c45b04a3e07042cc079d12ce69f4a3 Mon Sep 17 00:00:00 2001 From: Benjamin Ratti Date: Thu, 27 May 2021 09:45:34 +0200 Subject: [PATCH 05/37] feat(fs): ajout de la section integration --- fs/README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/fs/README.md b/fs/README.md index 2f3dfce..4943c61 100644 --- a/fs/README.md +++ b/fs/README.md @@ -31,6 +31,13 @@ Vous avez lancé un projet pour devenir FranceConnect+ et vous souhaiter connait - [Qu'est ce qu'eIDAS et quels sont les niveaux de garantie de FranceConnect+ ?](projet/projet-niveau-eidas.md) - [Quel est l'écosystème de FranceConnect+ ?](projet/projet-ecosysteme-fc+.md) +# J'intègre FranceConnect+ dans mon service en ligne + +## Je veus savoir comment fonctionne FranceConnect+ + +- [Qu'est ce que OpenID Connect ?]() +- [Comment FranceConnect+ utilise OpenID Connect?]() + ## Accès à l'environnement d'intégration FranceConnect+ Pour vous permettre de réaliser les développements liés à l'intégration de FranceConnect, nous mettons à disposition un environnement d'intégration. Les accès à cet environnement se font à travers des clés qui vous sont communiquées sur votre espace partenaire. From fa07a35225d048b51ee5c3aaebc62eec2432f712 Mon Sep 17 00:00:00 2001 From: Benjamin Ratti Date: Thu, 27 May 2021 12:09:43 +0200 Subject: [PATCH 06/37] feat(fs) : ajout de la doc sur les niveaux eIDAS --- fs/projet/projet-niveau-eidas.md | 47 +++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/fs/projet/projet-niveau-eidas.md b/fs/projet/projet-niveau-eidas.md index b6ef6f3..f5e26cb 100644 --- a/fs/projet/projet-niveau-eidas.md +++ b/fs/projet/projet-niveau-eidas.md @@ -1,6 +1,51 @@ -[Documentation Fournisseur de Service](../README.md) > [Gerer un projet d'integration FranceConnect+](../README.md#je-veux-devenir-fournisseur-de-service) > Données accessible via FranceConnect+ +[Documentation Fournisseur de Service](../README.md) > [Gerer un projet d'integration FranceConnect+](../README.md#je-g%C3%A8re-un-projet-dint%C3%A9gration-de-franceconnect) > eIDAS --- # Qu'est ce qu'eIDAS et quels sont les niveaux de garantie de FranceConnect+ ? +## Qu'est ce que le règlement eIDAS ? + +> Le règlement n° 910/2014 sur l'identification électronique et les services de confiance pour les +transactions électroniques au sein du marché intérieur, dit règlement « eIDAS », est un règlement +européen qui a été adopté le 23 juillet 2014 par le Parlement européen et le Conseil de l'Union +Européenne. L'objectif de ce règlement est de mettre en place un cadre juridique propre à +susciter une confiance accrue dans les transactions électroniques au sein du marché intérieur. +> +> Le règlement eIDAS s'applique à l’identification électronique et aux services de confiance +(faisant respectivement l’objet des chapitres II et III du présent document). Il accorde également +un effet juridique aux documents électroniques. + +Source : [FAQ eIDAS de l'ANSSI](https://www.ssi.gouv.fr/uploads/2017/01/eidas_faq_anssi.pdf) + +FranceConnect+ est concerné uniquement par le volet identification électronique du règlement. + +## Qu'est ce que les niveaux de garantie eIDAS ? + +Le niveau de garantie eIDAS permettre d'apporter une garantie sur l'identité qui est fournie au Fournisseur de Service. Ils sont définis par le règlement eIDAS avec chacun des exigences différentes. + +> * **Faible :** à ce niveau, l’objectif est simplement de réduire le risque d’utilisation abusive ou d’altération de l’identité ; +> * **Substantiel :** à ce niveau, l’objectif est de réduire substantiellement le risque d’utilisation abusive ou d’altération de l’identité ; +> * **Élevé :** à ce niveau, l’objectif est d’empêcher l’utilisation abusive ou l’altération de l’identité. + +Source : [Présentation du règlement eIDAS par l'ANSSI](https://www.ssi.gouv.fr/administration/reglementation/confiance-numerique/le-reglement-eidas/#:~:text=Substantiel%20%3A%20%C3%A0%20ce%20niveau%2C%20l,'alt%C3%A9ration%20de%20l'identit%C3%A9.) + +Le détail des exigeances est défini par [le règlement d’exécution n°2015/1502 du 8 septembre 2015](http://eur-lex.europa.eu/legal-content/FR/TXT/PDF/?uri=CELEX:32015R1502&from=FR) + +## Quels sont les niveaux eIDAS supportés par la plateforme FranceConnect+ ? + +FranceConnect+ a été qualifié par l'ANSSI pour le niveau élevé en tant que moyen d'identité électronique, c'est à dire que FranceConnect+ répond aux exigences pour permette d'apporter un niveau de garantie élevé en tant que moyen d'identification électronique. A ce titre, FranceConnect apparait dans la [liste des produits qualifiés par l'ANSSI](https://www.ssi.gouv.fr/uploads/liste-produits-et-services-qualifies.pdf) dans la section *moyen d'identification életronique*. + +Cependant, afin de pouvoir garantir un niveau élevé, il faut également que les Fournisseurs d'Identité soit également qualifié pour ce ce niveau. + +Actuellement, FranceConnect+ ne dispose que d'un seul Fournisseur d'Identité, L'identité Numérique La Poste, qui est qualifié pour le niveau substantiel par l'ANSSI. Ainsi, actuellement la plateforme FranceConnect+ ne peut délivrer des identités avec uniquement le niveau de garantie substantiel même s'il FranceConnect+ est déjà prêt pour délivrer des identités avec le niveau de garantie élevé. + +Le tableau ci-dessous récapitule les niveaux supportés par les deux plateformes FranceConnect et FranceConnect+. + +| Niveau de garantie | FranceConnect | FranceConnect+ | +| ------ | ------ | ------ | +| faible |  Oui | Non |  +| substantiel | Non | Oui |  +| élevé | Non | A venir | + +--- \ No newline at end of file From b88da4b71cda7006bbfb9d679e6b5bca81069315 Mon Sep 17 00:00:00 2001 From: Benjamin Ratti Date: Fri, 28 May 2021 17:39:23 +0200 Subject: [PATCH 07/37] feat(fs): ajout de la documentation sur oidc --- fs/README.md | 2 +- fs/diagrams/diagram-sequence-oauth.mmd | 15 +++ fs/diagrams/diagram-sequence-oauth.png | Bin 0 -> 95891 bytes fs/pilotage/pilotage-differences-fc-fc+.md | 4 +- fs/technique/technique-oidc.md | 123 +++++++++++++++++++++ 5 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 fs/diagrams/diagram-sequence-oauth.mmd create mode 100644 fs/diagrams/diagram-sequence-oauth.png create mode 100644 fs/technique/technique-oidc.md diff --git a/fs/README.md b/fs/README.md index 4943c61..0cdbbcc 100644 --- a/fs/README.md +++ b/fs/README.md @@ -35,7 +35,7 @@ Vous avez lancé un projet pour devenir FranceConnect+ et vous souhaiter connait ## Je veus savoir comment fonctionne FranceConnect+ -- [Qu'est ce que OpenID Connect ?]() +- [Qu'est ce que OpenID Connect ?](technique/technique-oidc.md) - [Comment FranceConnect+ utilise OpenID Connect?]() ## Accès à l'environnement d'intégration FranceConnect+ diff --git a/fs/diagrams/diagram-sequence-oauth.mmd b/fs/diagrams/diagram-sequence-oauth.mmd new file mode 100644 index 0000000..58dc957 --- /dev/null +++ b/fs/diagrams/diagram-sequence-oauth.mmd @@ -0,0 +1,15 @@ +```mermaid +sequenceDiagram + autonumber + participant RO as Resource Owner + participant C as Client + participant AS as Authorization Server + participant RS as Resource Server + + C->>RO: Authorization Request + RO-->>C: Authorization Grant + C->>AS: Authorization Grant + AS-->>C: Access Token + C->>RS: Access Token + RS-->>C: Protected Resource +``` \ No newline at end of file diff --git a/fs/diagrams/diagram-sequence-oauth.png b/fs/diagrams/diagram-sequence-oauth.png new file mode 100644 index 0000000000000000000000000000000000000000..043a0cfde8b432a694ee5a84df8b5fdb8579340d GIT binary patch literal 95891 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%0AbvXA<)IhSxD@T1?V* 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 + +1. Le client demande un accès au ressource auprès du proriétaire des ressources ( *resource owner ) en précisant le périmètre de la demande à l'aide de scopes. Le client s'identifie à l'aide de son client_id et indique le type d'autorisation demandée. + +2. Si le propriétaire de la ressource accepte d'accorder l'accès à ces ressources, une autorisation d'accès est délivrer au client + +3. Le client demande auprès du serveur d'autorisation un jeton d'accès ( *access token* ) en s'authentifiant et en fournissant l'autorisation d'accès reçu à l'étape précédente. + +4. Le serveur d'autorisation fourni un jeton d'accès après avoir authentifié le client et vérifier la validité de l'autorisation d'accès. + +5. Le client demande des ressources au serveur de ressources en fournissant l'access token fourni par le serveur d'autorisations. + +6. Le serveur de ressources retournes les ressources demandés en ayant au préalable vérifié la validité de l'access token. + +OAuth 2.0 propose les types d'autorisations suivants: authorization code, implicit, resource owner credentials, client credentials. + +Il faut noter que le protocole OAuth 2.O ne gère pas l'authentification de l'utilisateur. L'identité de l'utilisateur ne permet pas au client d'accéder au informations d'identités de l'utilisateur. Afin de rajouter ces informations, le protocole Openid Connect étant OAuth 2.0 pour intégrer l'accès aux informations d'identités de l'utilisateur. + +## Qu'apporte OpenId Connect à OAuth 2.0 ? + +Le protocole OpenId Connect s'appuie sur OAuth 2.0 en ajoutant des fonctionnalités supplémentaires : + +- La gestion d'information sur l'authentification +- l'ajout d'un ID Token +- la gestion d'un SSO et d'un déconnection +- une API pour récupérer les informations sur l'utilisateur (/userinfo) +- un standard sur les informations sur l'utilisateur +- un service de découverte des informations du serveur OpenID. + +### Quels sont les acteurs qui interviennent dans OpenId Connect ? + +OpenId Connect fait intervenir 3 acteurs : + +| Acteur OpenId Connect | Acteur similaire dans OAuth 2.0 | +| ------ | ------ | +| User |  Resource Owner | +| Relying Party | Client |  +| OpenID Provider | Authorization Server | + +### Qu'est ce que l'ID Token ? + +L'ID token est un jeton au format JWT qui est fourni en même temps que l'*access token*, il contient +- des information sur l'authtentification + - dates d'expiration, d'authentification, de création + - des moyens de contrôle permettant de valider l'ID Token et l'Access Token +- des attributs ( claims ) sur l'utilisateurs, qui peuvent être : + - standard : profile, email, address, phone, ... + - personnalisés par le serveur OpenId Connect. + + +**Exemple d'ID Token :** + +```json +{ + "sub": "4d327dd1e427daf4d50296ab71d6f3fc82ccc40742943521d42cb2bae4df41afv1", + "amr": [ "fc" ], + "auth_time": 1619605379, + "acr": "eidas3", + "nonce": "8c1696f884cac760436c9551ce34be81a3ab61171bf486dd31a58d2bc23a7bbd", + "at_hash": "zc4hJ6cxMmrkb8KQn9UXbg", + "aud": "6925fb8143c76eded44d32b40c0cb1006065f7f003de52712b78985704f39950", + "exp": 1619605440, + "iat": 1619605380, + "iss": "https://corev2.docker.dev-franceconnect.fr/api/v2" +} +``` + +[Plus d'information sur l'ID Token](https://openid.net/developers/specs/) + +### Quels sont les endpoints d'OpenId Connect ? + +Le protocole OpenID Connect propose les endpoints suivants : + +- **authorization** : permet de demander une authentification de l'utilisateur +- **token** : permet de demander un tocket ( *access token*, *refresh token*, *id token* ) +- **userinfo** : permet de récupérer les informations sur l'utilisateur +- **revocation** : permet de révoquer un token (*access token*, *refresh token*) +- **introspection** : permet de valider un jeton (*access token*, *refresh token*) +- **discovery** : permet de récupérer des informations sur le serveur OpenId Connect + +### Comment récupérer les tokens ? + +OpenId proposte 3 types de flow qui permettent de récupérer des tokens : + +- **Authorization code flow** : l'appel au endpoint *authorization* permet de récupérer un code d'autorisation qui est utilisé pour récupérer les tokens. +- **Implicit flow** : l'appel au endpoint *authorization* permet de récupérer directement les tokens, le refresh token ne peut pas être récupéré. +- **Hybrid flow** : Il s'agit d'un mix entre les deux. + + From 5a9fffe8d2ded149f4db96a62fbc5303fa59427e Mon Sep 17 00:00:00 2001 From: Nicolas Legeay Date: Tue, 15 Jun 2021 10:42:26 +0200 Subject: [PATCH 08/37] Update identite_pivot definition --- fs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/README.md b/fs/README.md index 0cdbbcc..09b5808 100644 --- a/fs/README.md +++ b/fs/README.md @@ -204,7 +204,7 @@ FranceConnect+ a étendu le mécanisme de scopes pour qu'il soit plus modulaire. **birth :** Regroupe les scopes birthplace et birthcountry. Permet de récupérer la ville et le département de naissance de la personne. -**identite_pivot :** Regroupe les scopes profile et birth. Permet de récupérer l'identité pivot complète plus le nom d'usage si disponible. +**identite_pivot :** Regroupe les scopes given_name, family_name, birthdate, gender, birthplace, birthcountry. Permet de récupérer l'identité pivot complète. Cette liste de scopes est définie par la norme OpenIDConnect : http://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims From d88e182d9548a3e687287918ceec4d7dbfb7c75d Mon Sep 17 00:00:00 2001 From: benratti Date: Wed, 6 Oct 2021 10:04:40 +0200 Subject: [PATCH 09/37] Update README.md --- fs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/README.md b/fs/README.md index 09b5808..d94f325 100644 --- a/fs/README.md +++ b/fs/README.md @@ -33,7 +33,7 @@ Vous avez lancé un projet pour devenir FranceConnect+ et vous souhaiter connait # J'intègre FranceConnect+ dans mon service en ligne -## Je veus savoir comment fonctionne FranceConnect+ +## Je veux savoir comment fonctionne FranceConnect+ - [Qu'est ce que OpenID Connect ?](technique/technique-oidc.md) - [Comment FranceConnect+ utilise OpenID Connect?]() From 3549ab67105049a4502fd1a1a2d17ebb1d139cdd Mon Sep 17 00:00:00 2001 From: Benjamin Ratti Date: Wed, 27 Oct 2021 08:53:03 +0200 Subject: [PATCH 10/37] feat(fs): ajout de oidc dans fc+ --- fs/README.md | 64 +----------------- fs/integration/integration-oidc.md | 2 +- fs/technique/technique-oidc-fc.md | 103 +++++++++++++++++++++++++++++ 3 files changed, 105 insertions(+), 64 deletions(-) create mode 100644 fs/technique/technique-oidc-fc.md diff --git a/fs/README.md b/fs/README.md index d94f325..23e0dbe 100644 --- a/fs/README.md +++ b/fs/README.md @@ -36,7 +36,7 @@ Vous avez lancé un projet pour devenir FranceConnect+ et vous souhaiter connait ## Je veux savoir comment fonctionne FranceConnect+ - [Qu'est ce que OpenID Connect ?](technique/technique-oidc.md) -- [Comment FranceConnect+ utilise OpenID Connect?]() +- [Comment FranceConnect+ utilise OpenID Connect?](technique/technique-oidc-fc.md) ## Accès à l'environnement d'intégration FranceConnect+ @@ -81,68 +81,6 @@ Les adresses de notre environnement de production sont les suivantes : Un fournisseur de Service de démonstration est disponible à l'adresse [fsp1v2.integ01.dev-franceconnect.fr](https://fsp1v2.integ01.dev-franceconnect.fr//). -# Concepts de base -## Le protocole OpenID Connect -### Introduction - -Le protocole OpenID Connect est au cœur du fonctionnement de FranceConnect. C'est une couche d'identification basée sur protocole OAuth 2.0. Il permet à des Clients (ici, les Fournisseur de Service) d'accéder à l'identité des Utilisateurs finaux (les internautes) par l'intermédiaire d'un serveur d'autorisation (ici, les Fournisseurs d'Identité). - -La spécification du protocole se trouve sur http://openid.net/connect/. - -Pour une référence d'implémentation OpenID Connect voici le lien : https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowAuth - -### Les flux standards - -Le protocole OpenID Connect définit 3 appels REST faits par le client, et 4 endpoints (un du côté client, et trois du côté provider). - -En amont, le client s'inscrit (en général manuellement) auprès du provider. Il lui fournit une URL de callback (l'URL du client vers lequel l'internaute est redirigé une fois authentifié), aussi appelée "callback endpoint". En retour le provider donne au client un client ID et un client secret. - -Lorsque l'internaute clique sur le bouton d'authentification du client, le flux est le suivant : - -1. Le client fait une redirection vers le "authorization endpoint" du provider avec son client id et son url de callback. Le provider redirige alors l'internaute vers sa mire d'authentification. Si l'internaute se loggue correctement, le provider renvoie un code d'autorisation au client. -2. Le client fait un appel Web service vers le "token endpoint" du provider avec le code d'autorisation reçu, et authentifie cette requête avec son client id et son client secret. Le provider retourne un access token (une chaîne de caractères encodée en base64), un id token (sous la forme d'un Json Web Token), et parfois un refresh token (une chaîne de caractères en base64). -3. Le client fait un appel Web service vers le "userInfo endpoint" du provider avec l'access token reçu, et le provider renvoie les informations de l'internaute au client. - -### Dans le cadre de FranceConnect - -L'enregistrement des Fournisseurs de Service auprès de FranceConnect+ s'effectue en déposant une demande sur le site [datapass.api.gouv.fr](https://datapass.api.gouv.fr/) - -FranceConnect+ implémente le flux [Authorization Code Flow](https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowAuth) d'OpenID Connect. - -Les fournisseurs de service doivent être clients OpenID Connect, et les fournisseurs d'identité doivent être fournisseurs OpenID Connect. FranceConnect+ est une brique intermédiaire qui est à la fois fournisseur (du point de vue des FS) et client (du point de vue des FI). - -### Chiffrement et signature des échanges - -Tous les échanges de jetons JWT entre FranceConnect+ et le Fournisseur de Service sont signés et chiffrés en utilisant les algorithmes suivants : - -**Signature de jetons par le FI** : - -- Asymétrique : - - - ES256 (EC + SHA256) - - RS256 (RSA + SHA256) - -**Chiffrement des jetons (jwe+jws)** : - -- Hybride : - - - RSA-OEAP + AES256-GCM - - ECDH-ES + AES256-GCM - -Les spécifications des algorithmes de signatures et de chiffrements utilisés sont les suivantes : - -* [JWA - https://tools.ietf.org/html/rfc7518](https://tools.ietf.org/html/rfc7518) -* [JWS - https://tools.ietf.org/html/rfc7515#appendix-A.3](https://tools.ietf.org/html/rfc7515#appendix-A.3) -* [JWE - https://tools.ietf.org/html/rfc7516#appendix-A.1](https://tools.ietf.org/html/rfc7516#appendix-A.1) - -Les clés publiques de signatures de FranceConnect+ sont disponibles via la *JWKS URL* présente dans les méta-data de la *Discovery URL* à l'adresse suivantes et sont changées régulièrement : - -| Environnement | adresses du endpoint | -| ------ | ------ | -| intégration FC | https://auth.integ01.dev-franceconnect.fr/api/v2/jwks | -| production FC | https://auth.franceconnect.gouv.fr/api/v2/jwks |  - -les clés de signatures utilisés par le Fournisseur d'Identité doivent être disponible via la *JWKS URL* présente dans les méta-data de la *Discovery URL* . ## Les données usagers Les données usagers sont fournies par les Fournisseurs d'Identité aux Fournisseurs de Service, via FranceConnect, conformément à l'habilitation obtenue via [datapass.api.gouv.fr](https://datapass.api.gouv.fr), et le choix des données réalisé par le fournisseur de service dans cette demande. diff --git a/fs/integration/integration-oidc.md b/fs/integration/integration-oidc.md index a7fe4f6..f777be3 100644 --- a/fs/integration/integration-oidc.md +++ b/fs/integration/integration-oidc.md @@ -2,7 +2,7 @@ --- -# Qu'est ce que le protocole OpenID Connect +# Qu'est ce que le protocole OpenID Connect ? ## Introduction Le protocole OpenID Connect est au cœur du fonctionnement de FranceConnect+. C'est une couche d'identification basée sur protocole OAuth 2.0. Il permet à des Clients (ici, les Fournisseur de Service) d'accéder à l'identité des Utilisateurs finaux (les internautes) par l'intermédiaire d'un serveur d'autorisation (ici, les Fournisseurs d'Identité). diff --git a/fs/technique/technique-oidc-fc.md b/fs/technique/technique-oidc-fc.md new file mode 100644 index 0000000..254df56 --- /dev/null +++ b/fs/technique/technique-oidc-fc.md @@ -0,0 +1,103 @@ + + +--- + +# Comment FranceConnect+ utilise le protocole OpenId Connect ? + +FranceConnect+ met en oeuvre le protocole OpenID Connect pour permettre à un fournisseur de service de déléguer à FranceConnect+ l'identificiation et l'authentification des usagers, ainsi que la gestion des consentements qui sont nécessaire à la transmission des données personnelles des utilisateurs auprès du fournisseur de service. + +## Les acteurs + +Pour rappel, le protocole OpenID Connect défini les acteurs suivants : *User*, *Relying Party* et *OpenID Provider*. + +OpenId Connect fait intervenir 3 acteurs : + +| Acteur OpenId Connect | Acteur dans le contexte FranceConnect+ | +| ------ | ------ | +| User |  Usager du fournisseur de service | +| Relying Party | Fournisseur de service |  +| OpenID Provider | FranceConnect+ | + +## Flow OpenID Connect + +Le protocole OpenID Connect propose différents *flow* permettant de récupérer des tokens. FranceConnect+ n'implémente que [Authorization code flow](https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowAuth). + +## Discovery Mode + +Le protocole OpenId Connect permet à *l'Identity Provider* d'exposer à *Relying Party* de récupérer dynamiquement ses données de configuration (*meta-data*). + +[Plus d'information sur OpenID Connect Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html) + +FranceConnect+ expose ses méta-data via les discovery url suivante : + +| Environnement | Adresse | +| ------ | ------ | +| Integration | https://auth.integ01.dev-franceconnect.fr/api/v2/.well-known/openid-configuration | +| Production | https://auth.franceconnect.gouv.fr/api/v2/.well-known/openid-configuration | + + + +## Signature et chiffrement des jetons + +FranceConnect+ permet de récupérer différents types de jetons : + +| Jeton | Format | +| --- | --- | +| *access token* | chaine de caractères | +| *id_tokent* | JWT |  +| *user info* | JWT |  + +L'ensemble de jetons JWT fournis par FranceConnect+, c'est à dire l'ID Token et les *User Info* sont chiffrés et signés afin de garantir un niveau de confidentialité et d'intégrité afin de satisfaire les exigences des niveaux de garantie subtantiel et élévée défini dans le règlement eIDAS. + +### Signature des jetons + +Les jetons sont **signés** par FranceConnect en utilisant les clés de chiffrement de FranceConnect+ afin de permettre au fournisseur de service de **s'assurer que ces deux jetons sont bien emis par FranceConnect+**. Le fournisseur de service doit donc vérifier la signature des jetons en ayant pris le soin de récupérer les clés publiques de signature de FranceConnect+. + +La **signature** permet de garantir **l'intégrité** et **l'authenticité** des données échangées. + +## Chiffrement des jetons + +Les jetons sont **chiffrés** par FranceConnect en utilisant un des clés publiques de chiffrement mis à disposition par le fournisseur de service afin de **s'assurer que seul le fournisseur de service ne puisse consulter** les informations présentes dans ces jetons. Le fournisseur de service doit mettre à disposition de FranceConnect+ ses clés publiques de chiffrement. + +Le **chiffrement** permet de garantir la **confidentialité** des données échangées. + +## Algorithme de signature et de chiffrement + +Tous les échanges de jetons JWT entre FranceConnect+ et le Fournisseur de Service sont signés et chiffrés en utilisant les algorithmes suivants : + +**Signature de jetons par FranceConnect+** : + +- Asymétrique : + + - ES256 (EC + SHA256) + +**Chiffrement des jetons (jwe+jws)** : + +- Hybride : + + - RSA-OEAP + AES256-GCM + - ECDH-ES + AES256-GCM + +Les spécifications des algorithmes de signatures et de chiffrements utilisés sont les suivantes : + +* [JWA - https://tools.ietf.org/html/rfc7518](https://tools.ietf.org/html/rfc7518) +* [JWS - https://tools.ietf.org/html/rfc7515#appendix-A.3](https://tools.ietf.org/html/rfc7515#appendix-A.3) +* [JWE - https://tools.ietf.org/html/rfc7516#appendix-A.1](https://tools.ietf.org/html/rfc7516#appendix-A.1) + +#### Exposition des clés de singature + +Les clés publiques de signature de FranceConnect+ sont disponibles via la *JWKS URL* présente dans les méta-data de la *Discovery URL* à l'adresse suivantes et sont changées régulièrement : + +| Environnement | adresses du endpoint | +| ------ | ------ | +| intégration FC | https://auth.integ01.dev-franceconnect.fr/api/v2/jwks | +| production FC | https://auth.franceconnect.gouv.fr/api/v2/jwks | + +#### Exposition des clés de chiffrement + +Les clés publiques de chiffrement du fournisseur de service doivent être exposées à FranceConnect+ par le fournisseur de service sous la forme d'une *URL* au format JWK. + +[Plus d'information sur le JWK](https://datatracker.ietf.org/doc/html/rfc7517) + + + From 654bc6106b149a7b37116b17bf6f7f40c2508ac7 Mon Sep 17 00:00:00 2001 From: Benjamin Ratti Date: Wed, 27 Oct 2021 10:48:29 +0200 Subject: [PATCH 11/37] feat(fs): ajout des scopes --- fs/README.md | 105 +---------------------------- fs/projet/projet-donnees-fc+.md | 6 +- fs/technique/technique-env-fc.md | 53 +++++++++++++++ fs/technique/technique-oidc-fc.md | 2 +- fs/technique/technique-scope-fc.md | 90 +++++++++++++++++++++++++ 5 files changed, 150 insertions(+), 106 deletions(-) create mode 100644 fs/technique/technique-env-fc.md create mode 100644 fs/technique/technique-scope-fc.md diff --git a/fs/README.md b/fs/README.md index 23e0dbe..4a46e22 100644 --- a/fs/README.md +++ b/fs/README.md @@ -38,43 +38,11 @@ Vous avez lancé un projet pour devenir FranceConnect+ et vous souhaiter connait - [Qu'est ce que OpenID Connect ?](technique/technique-oidc.md) - [Comment FranceConnect+ utilise OpenID Connect?](technique/technique-oidc-fc.md) -## Accès à l'environnement d'intégration FranceConnect+ +## Je veux savoir comment utiliser FranceConnect+ -Pour vous permettre de réaliser les développements liés à l'intégration de FranceConnect, nous mettons à disposition un environnement d'intégration. Les accès à cet environnement se font à travers des clés qui vous sont communiquées sur votre espace partenaire. +- [Comment accéder aux différents environnements de FranceConnect+ ?](technique/technique-env-fc.md) +- [Comment utiliser les scopes OpenID Connect pour accéder aux données des utilisateurs ? ](technique/technique-scope-fc.md) -Sur notre environnement d'intégration, vous pouvez utiliser le fournisseur d'identité "Démonstration" dont les données sont modifiables ici : https://github.com/france-connect/identity-provider-example/blob/master/database.csv - -Vous pouvez proposer de nouvelles identités de tests directement sur ce fichier. - -Les adresses de notre environnement d'intégration sont les suivantes : - -| EndPoint | Adresse | -| ------ | ------ | -| Discovery URL | https://auth.integ01.dev-franceconnect.fr/api/v2/.well-known/openid-configuration |  -| Authorization | https://auth.integ01.dev-franceconnect.fr/api/v2/authorize | -| Token | https://auth.integ01.dev-franceconnect.fr/api/v2/token | -| UserInfo | https://auth.integ01.dev-franceconnect.fr/api/v2/userinfo |  -| Logout | https://auth.integ01.dev-franceconnect.fr/api/v2/logout |  - -## Mettre en production mon Fournisseur de Service - -Pour mettre en production votre Fournisseur de Service, il faut au préalable avoir : - -1. Reçu la qualification de vos développements par FranceConnect+ sur un environnement autre que votre production. -2. Demandé une mise en production à travers votre [espace partenaire]((https://partenaires.franceconnect.gouv.fr/login)) -3. Utilisé les clés de production qui vous ont été fournies par FranceConnect. - -**Attention :** Il ne faut surtout pas utiliser les clés d'intégration que vous avez utilisées lors de vos développements avec votre Fournisseur de Service en production. Les clés d'intégration ne sont utilisables que sur l'environnement d'intégration FranceConnect. - -Les adresses de notre environnement de production sont les suivantes : - -| EndPoint | Adresse | -| ------ | ------ | -| Discovery URL | https://auth.franceconnect.gouv.fr/api/v2/.well-known/openid-configuration |  -| Authorization | https://auth.franceconnect.gouv.fr/api/v2/authorize | -| Token | https://auth.franceconnect.gouv.fr/api/v2/token | -| UserInfo | https://auth.franceconnect.gouv.fr/api/v2/userinfo |  -| Logout | https://auth.franceconnect.gouv.fr/api/v2/logout |  ## Réaliser des tests avant de soumettre sa demande d'habilitation @@ -82,71 +50,7 @@ Les adresses de notre environnement de production sont les suivantes : Un fournisseur de Service de démonstration est disponible à l'adresse [fsp1v2.integ01.dev-franceconnect.fr](https://fsp1v2.integ01.dev-franceconnect.fr//). -## Les données usagers -Les données usagers sont fournies par les Fournisseurs d'Identité aux Fournisseurs de Service, via FranceConnect, conformément à l'habilitation obtenue via [datapass.api.gouv.fr](https://datapass.api.gouv.fr), et le choix des données réalisé par le fournisseur de service dans cette demande. - -L'identité pivot permet d'identifier un utilisateur particulier. - -* Nom de naissance -* Prénoms -* Sexe -* Date de naissance -* Code géographique INSEE de la ville de naissance -* Code géographique INSEE du pays de naissance - -En complément, il est possible d'obtenir le nom d'usage. Cependant cette donnée n'est pas obligatoirement connue par tous les Fournisseurs d'Identité. - -Vous pouvez avoir accès également à l'adresse email. Cette donnée de contact a également été vérifiée par le Fournisseur d'identité. Il est à remarquer que la donnée "adresse email" peut différer selon le Fournisseur d'Identité choisi par l'usager. - -FranceConnect+ transmet systématiquement au Fournisseur de Service un identifiant unique pour chaque utilisateur : - -* Cet identifiant est spécifique à chaque Fournisseur de Service. Un même utilisateur aura donc un identifiant unique différent pour chacun des Fournisseurs de Service auxquels il accède. -* Cet identifiant est le même quelque soit le Fournisseur d'Identité qui est utilisé par l'utilisateur. - -A noter que pour les niveaux de garantie d'identité eIDAS 2 et 3 (substantiel et élevé), les données d'identité fournies au fournisseur de service sont celles directement issues du fournisseur d'identité choisi par l'utilisateur, sans redressement RNIPP (INSEE). Ces données peuvent donc légèrement varier d'un fournisseur d'identité à l'autre, nous préconisons donc de réaliser le rapprochement/réconciliation sur la base de l'identifiant unique de l'utilisateur fourni par FranceConnect. - -### Liste des scopes disponible lors de l'étape d'authentification FranceConnect - -FranceConnect+ a étendu le mécanisme de scopes pour qu'il soit plus modulaire. - -* Un seul scope est obligatoire : openid. Il permet de récupérer le sub (identifiant unique technique) de l'utilisateur. -* Il est possible de récupérer individuellement chaque propriété de l'identité pivot en utilisant leurs scopes dédiés. -* Il est possible de combiner plusieurs scopes de son choix pour récupérer seulement les informations dont a besoin le FS. - - -| Champs | Type | Description | Format | -|--------------|--------|-------------|--------| -| given_name | string | les prénoms séparés par des espaces (standard OpenIDConnect) | [A-Za-zÀÂÄÇÉÈÊËÎÏÔÖÙÛÜŸàâäçéèêëîïôöùûüÿÆŒæœ -'] | | -| family_name | string | le nom de famille de naissance (standard OpenIDConnect) |  [A-ZÀÂÄÇÉÈÊËÎÏÔÖÙÛÜŸÆŒ \-']| | -| birthdate | string | la date de naissance au format YYYY-MM-DD (standard OpenIDConnect) | [ YYYY-01-01 ] - (\d{4})-01-01 - (Présumé mois) [ YYYY-MM-01 ] - (\d{4})-(\d{2})-01 - (Présumé jours) [ YYYY-MM-DD ] - (\d{4})-(\d{2})-(\d{2}) | -| gender | string | male pour les hommes, female pour les femmes (standard OpenIDConnect)| Masculin : M (male) Féminin : F (female) |  -| birthplace | string | le code INSEE du lieu de naissance sur 5 chiffres (ou une chaîne vide si la personne est née à l'étranger) | Si né en France (Taille de 5) [(([0-8][0-9AB])|(9[0-8AB]))[0-9]{3}] - [Details] - [Liste] En cas de pays étranger : Champs vide |  -| birthcountry | string | le code INSEE du pays de naissance sur 5 chiffres | Pour les pays étrangers (Taille de 5 ) [99[0-9]{3}] - [Details] Pour la France 99100 | - - - -### Les données complémentaires - -| Champs | Type | Description | Format | -|--------------|--------|-------------|--------| -| sub | string | identifiant technique (standard OpenIDConnect) | 66 caractères hexa + lettre 'v' | -| email | string | l'adresse électronique de contact de la personne (standard OpenIDConnect) | RFC 5322 | -| preferred_username | string | le nom d'usage (standard OpenIDConnect) | [A-ZÀÂÄÇÉÈÊËÎÏÔÖÙÛÜŸÆŒ \-'] | - - - -### Les "alias" - -**profile :** Regroupe les scopes given_name, family_name, birthdate et gender. Si disponible, renvoie aussi preferred_username - -**birth :** Regroupe les scopes birthplace et birthcountry. Permet de récupérer la ville et le département de naissance de la personne. - -**identite_pivot :** Regroupe les scopes given_name, family_name, birthdate, gender, birthplace, birthcountry. Permet de récupérer l'identité pivot complète. - -Cette liste de scopes est définie par la norme OpenIDConnect : http://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims - -# Je veux identifier/authentifier des utilisateurs via FranceConnect # Intégration d'un bouton FranceConnect+ @@ -170,9 +74,6 @@ Téléchargements : La récupération de l'identité pivot doit être faite dans la suite immédiate des appels précédents (authentification et récupération du code). Le fait d'appeler ce Web service plus tard n'est aujourd'hui pas proposé. -### Détail des flux - -Les flux entre FranceConnect+ et le Fournisseur de Service respectent ce qui est défini dans la norme OpenId Connect. Pour plus de détails, il faut se référer à la [documentation OIDC - https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowAuth](https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowAuth) ## Utiliser les niveaux eIDAS en tant que FS diff --git a/fs/projet/projet-donnees-fc+.md b/fs/projet/projet-donnees-fc+.md index 230954c..5a1ec96 100644 --- a/fs/projet/projet-donnees-fc+.md +++ b/fs/projet/projet-donnees-fc+.md @@ -2,7 +2,7 @@ --- -# je veux connaitre les données que je peux récupérer de FranceConnect+ +# Je veux connaitre les données que je peux récupérer de FranceConnect+ Les données usagers sont fournies par les Fournisseurs d'Identité aux Fournisseurs de Service, via FranceConnect+, conformément à l'habilitation obtenue via [datapass.api.gouv.fr](https://datapass.api.gouv.fr), et le choix des données réalisé par le fournisseur de service dans cette demande. @@ -12,8 +12,8 @@ L'identité pivot permet d'identifier un utilisateur particulier. * Prénoms * Sexe * Date de naissance -* Code géographique INSEE de la ville de naissance -* Code géographique INSEE du pays de naissance +* [Code géographique INSEE de la ville de naissance](https://www.insee.fr/fr/information/2560452) +* [Code géographique INSEE du pays de naissance](https://www.insee.fr/fr/information/2560452) En complément, il est possible d'obtenir le nom d'usage. Cependant cette donnée n'est pas obligatoirement connue par tous les Fournisseurs d'Identité. Cette donnée ne sera donc pas transmise systématiquement si vous la demandez. diff --git a/fs/technique/technique-env-fc.md b/fs/technique/technique-env-fc.md new file mode 100644 index 0000000..961f7f1 --- /dev/null +++ b/fs/technique/technique-env-fc.md @@ -0,0 +1,53 @@ + + +--- + +# Comment accéder aux différents environnements de FranceConnect+ ? + +FranceConnect met à disposition deux environnements : + +- intégration : à utiliser pour l'ensemble de vos développements et test hors production +- production : à utiliser uniquement pour votre service en production + + +## Accès à l'environnement d'intégration FranceConnect+ + +Pour vous permettre de réaliser les développements liés à l'intégration de FranceConnect, nous mettons à disposition un environnement d'intégration. Les accès à cet environnement se font à travers des clés qui vous sont communiquées sur votre espace partenaire. + +Pour utiliser l'environnement d'intégration, il faut au préalable avoir : +- avoir fait une demande datapass et que celle-ci soit validée +- avoir fait une demande de création d'un FS en environnement d'intégration FC+ et avoir reçu vos clés d'intégration + +Sur notre environnement d'intégration, vous pouvez utiliser le fournisseur d'identité "Démonstration" dont les données sont modifiables ici : https://github.com/france-connect/identity-provider-example/blob/master/database.csv + + +Les adresses de notre environnement d'intégration sont les suivantes : + +| EndPoint | Adresse | +| ------ | ------ | +| Discovery URL | https://auth.integ01.dev-franceconnect.fr/api/v2/.well-known/openid-configuration | +| Authorization | https://auth.integ01.dev-franceconnect.fr/api/v2/authorize | +| Token | https://auth.integ01.dev-franceconnect.fr/api/v2/token | +| UserInfo | https://auth.integ01.dev-franceconnect.fr/api/v2/userinfo | +| Logout | https://auth.integ01.dev-franceconnect.fr/api/v2/logout | + +## Accès à l'environnement de production FranceConnect+ + +Pour avoir accès à l'environnement de production FranceConnect+, il faut au préalable avoir : + +1. Reçu la qualification de vos développements par FranceConnect+ sur un environnement autre que votre production. +2. Demandé une mise en production via le formulaire à votre disposition ( *TODO lien vers le formulaire de MEP FC+*) +3. Configuré votre fournisseur de service de production FranceConnect+ avec les clés de production qui vous ont été fournies par l'équipe FranceConnect. + +**Attention :** Il ne faut surtout pas utiliser les clés d'intégration que vous avez utilisées lors de vos développements avec votre Fournisseur de Service en production. Les clés d'intégration ne sont utilisables que sur l'environnement d'intégration FranceConnect+. De même, il n'est pas possible d'utiliser des clés de production de FranceConnect sur FranceConnect+. + + +Les adresses de notre environnement de production sont les suivantes : + +| EndPoint | Adresse | +| ------ | ------ | +| Discovery URL | https://auth.franceconnect.gouv.fr/api/v2/.well-known/openid-configuration | +| Authorization | https://auth.franceconnect.gouv.fr/api/v2/authorize | +| Token | https://auth.franceconnect.gouv.fr/api/v2/token | +| UserInfo | https://auth.franceconnect.gouv.fr/api/v2/userinfo | +| Logout | https://auth.franceconnect.gouv.fr/api/v2/logout | \ No newline at end of file diff --git a/fs/technique/technique-oidc-fc.md b/fs/technique/technique-oidc-fc.md index 254df56..9a66d9c 100644 --- a/fs/technique/technique-oidc-fc.md +++ b/fs/technique/technique-oidc-fc.md @@ -1,4 +1,4 @@ - +[Documentation Fournisseur de Service](../README.md) > [J'intègre FranceConnect+ dans mon service en ligne](../README.md#jint%C3%A8gre-franceconnect-dans-mon-service-en-ligne) > Comment FranceConnect+ utilise le protocole OpenId Connect ? --- diff --git a/fs/technique/technique-scope-fc.md b/fs/technique/technique-scope-fc.md new file mode 100644 index 0000000..cb70dea --- /dev/null +++ b/fs/technique/technique-scope-fc.md @@ -0,0 +1,90 @@ + + +--- + +# Comment utiliser les scopes OpenID Connect pour accéder aux données des utilisateurs ? + +Les données des utilisateurs mis à disposition d'un fournisseur de service est décrit à la page [Je veux connaitre les données que je peux récupérer de FranceConnect+ ](../projet/projet-donnees-fc+.md). Pour rappel les données d'identité accessible sont les suivantes : + +* Nom de naissance +* Prénoms +* Sexe +* Date de naissance +* [Code géographique INSEE de la ville de naissance](https://www.insee.fr/fr/information/2560452) +* [Code géographique INSEE du pays de naissance](https://www.insee.fr/fr/information/2560452) +* Nom d'usage + +## Scope et Claims dans OpenID Connect + +### Qu'est ce qu'un scope dans OpenID Connect ? + +> Les clients OpenID Connect utilisent des *scopes* tels que définis dans la section 3.3 de [OAuth 2.0 [RFC6749]](https://openid.net/specs/openid-connect-basic-1_0.html#RFC6749) pour spécifier quels privilèges d'accès sont demandés pour les *access token*. Les *scopes* associées aux *access token* déterminent les ressources qui seront disponibles lorsqu'elles sont utilisées pour accéder aux *endpoints* protégés par OAuth 2.0. Pour OpenID Connect, les *scopes* peuvent être utilisées pour demander que des ensembles d'informations spécifiques soient mis à disposition en tant que *claims*. + +*Source: [OpenID Connect Basic Client Implementer's Guide 1.0](https://openid.net/specs/openid-connect-basic-1_0.html#Scopes)* + +Le protocole OpenID Connect défini un certain nombre de [scopes standards](https://openid.net/specs/openid-connect-basic-1_0.html#Scopes) qu'il est possible d'étendre avec des *scopes* spécifiques supplémentaires en fonction du besoin de l'*identity provider*. + +*En bref :* Les scopes permettent de définir l'ensemble des informations à disposition du fournisseur de service pour une cinématique. + +### Qu'est ce qu'un claim dans OpenID Connect ? + +Dans OpenId Connect, un claim est une information relative à l'utilisateur ou à la phase l'authentification. Ces informations peuvent être disponible soit dans l'ID Token, soit dans la réponse du UserInfo. Les claims retournés dans ces jetons dépendent des scopes associés à l'*access token*. + +Le protocole OpenId Connect defini un certain nombre de [claims standards](https://openid.net/specs/openid-connect-core-1_0.html#Claims). + +*En Bref :* Les claims sont les informations sur l'utilisateur ou la phase d'authentification disponible dans l'ID Token ou dans la réponse de UserInfo. + +## Les scopes et les claims dans FranceConnect+ + +### Liste des claims + +#### Les données d'identité + +| Champs | Type | Description | Format | +|--------------|--------|-------------|--------| +| given_name | string | les prénoms séparés par des espaces (standard OpenIDConnect) | [A-Za-zÀÂÄÇÉÈÊËÎÏÔÖÙÛÜŸàâäçéèêëîïôöùûüÿÆŒæœ -'] | | +| family_name | string | le nom de famille de naissance (standard OpenIDConnect) |  [A-ZÀÂÄÇÉÈÊËÎÏÔÖÙÛÜŸÆŒ \-']| | +| birthdate | string | la date de naissance au format YYYY-MM-DD (standard OpenIDConnect) | [ YYYY-01-01 ] - (\d{4})-01-01 - (Présumé mois) [ YYYY-MM-01 ] - (\d{4})-(\d{2})-01 - (Présumé jours) [ YYYY-MM-DD ] - (\d{4})-(\d{2})-(\d{2}) | +| gender | string | male pour les hommes, female pour les femmes (standard OpenIDConnect)| Masculin : M (male) Féminin : F (female) |  +| birthplace | string | le code INSEE du lieu de naissance sur 5 chiffres (ou une chaîne vide si la personne est née à l'étranger). Une lettre peut être présente pour les personnes nées en corse.| Si né en France (Taille de 5) [(([0-8][0-9AB])|(9[0-8AB]))[0-9]{3}] - [Details](http://xml.insee.fr/schema/cog.html#CodeCommuneFrancaiseOuPaysOuTerritoireEtranger_stype) - [Liste](https://www.insee.fr/fr/information/3363419)
En cas de pays étranger : Champs vide |  +| birthcountry | string | le code INSEE du pays de naissance sur 5 chiffres | Pour les pays étrangers (Taille de 5 ) [99[0-9]{3}] - [Details](http://xml.insee.fr/schema/cog.html#CodePaysOuTerritoireEtranger_stype) Pour la France 99100 | + + +### Les données complémentaires + +| Champs | Type | Description | Format | +|--------------|--------|-------------|--------| +| sub | string | identifiant technique (standard OpenIDConnect) | 66 caractères hexa + lettre 'v' | +| email | string | l'adresse électronique de contact de la personne (standard OpenIDConnect) | [RFC 5322](https://xml2rfc.tools.ietf.org/public/rfc/html/rfc5322.html#addrspec) | +| preferred_username | string | le nom d'usage (standard OpenIDConnect) | [A-ZÀÂÄÇÉÈÊËÎÏÔÖÙÛÜŸÆŒ \-'] | + +### Les données sur l'authentification + +Les claims relatifs à l'authentification disponible par FranceConnect+ sont des claims standards et sont disponible uniquement dans l'ID Token. Ces claims sont les suivants : + +- amr +- acr +- sid +- auth_time +- iss + +[Plus d'informations sur ces claims](https://openid.net/specs/openid-connect-basic-1_0.html#IDToken) + +### Correspondance entre scope et claims sur FranceConnect+ + +Le tableau suivant décris la liste des *claims* accessible en fonction des *scopes* associés à l'access token. + +| Scope | Claims | +| --- | --- | +| openid | sub | +| gender | gender | +| birthdate | birthdate | +| birthcountry | birthcountry | +| birthplace | birthplace | +| given_name | given_name | +| family_name | family_name | +| email | email | +| preferred_username | preferred_username | +| profile | family_name, given_name, preferred_username, gender, birthdate | +| birth | birthplace, birthcountry | +| identite_pivot |given_name, family_name, birthdate, gender, birthplace, birthcountry | From 0c4c7c93349233eb48cbe8d4f61d2541ab282d87 Mon Sep 17 00:00:00 2001 From: Fabien Gourdin Date: Wed, 8 Dec 2021 15:53:55 +0100 Subject: [PATCH 12/37] Update technique-scope-fc.md clarify gender values returned --- fs/technique/technique-scope-fc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/technique/technique-scope-fc.md b/fs/technique/technique-scope-fc.md index cb70dea..42cbf9d 100644 --- a/fs/technique/technique-scope-fc.md +++ b/fs/technique/technique-scope-fc.md @@ -45,7 +45,7 @@ Le protocole OpenId Connect defini un certain nombre de [claims standards](https | given_name | string | les prénoms séparés par des espaces (standard OpenIDConnect) | [A-Za-zÀÂÄÇÉÈÊËÎÏÔÖÙÛÜŸàâäçéèêëîïôöùûüÿÆŒæœ -'] | | | family_name | string | le nom de famille de naissance (standard OpenIDConnect) |  [A-ZÀÂÄÇÉÈÊËÎÏÔÖÙÛÜŸÆŒ \-']| | | birthdate | string | la date de naissance au format YYYY-MM-DD (standard OpenIDConnect) | [ YYYY-01-01 ] - (\d{4})-01-01 - (Présumé mois) [ YYYY-MM-01 ] - (\d{4})-(\d{2})-01 - (Présumé jours) [ YYYY-MM-DD ] - (\d{4})-(\d{2})-(\d{2}) | -| gender | string | male pour les hommes, female pour les femmes (standard OpenIDConnect)| Masculin : M (male) Féminin : F (female) |  +| gender | string | male pour les hommes, female pour les femmes (standard OpenIDConnect)| Masculin : male Féminin : female |  | birthplace | string | le code INSEE du lieu de naissance sur 5 chiffres (ou une chaîne vide si la personne est née à l'étranger). Une lettre peut être présente pour les personnes nées en corse.| Si né en France (Taille de 5) [(([0-8][0-9AB])|(9[0-8AB]))[0-9]{3}] - [Details](http://xml.insee.fr/schema/cog.html#CodeCommuneFrancaiseOuPaysOuTerritoireEtranger_stype) - [Liste](https://www.insee.fr/fr/information/3363419)
En cas de pays étranger : Champs vide |  | birthcountry | string | le code INSEE du pays de naissance sur 5 chiffres | Pour les pays étrangers (Taille de 5 ) [99[0-9]{3}] - [Details](http://xml.insee.fr/schema/cog.html#CodePaysOuTerritoireEtranger_stype) Pour la France 99100 | From 5ef9fbba9c7474a7f1573eedbc5671c43cb683de Mon Sep 17 00:00:00 2001 From: benratti Date: Thu, 10 Nov 2022 14:00:43 +0100 Subject: [PATCH 13/37] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3ac8581..099cfc6 100644 --- a/README.md +++ b/README.md @@ -3,4 +3,4 @@ Cette documentation regroupe l'ensemble des informations nécessaire à l'intégration de FranceConnect+, que ce soit en tant que Fournisseur d'identités de FranceConnect+ ou en tant que Fournisseur de services. - [documentation Fournisseur d'identités](/fi/docs-fi.md) -- [documentation Fournisseur de services](/fs/docs-fs.md) \ No newline at end of file +- [documentation Fournisseur de services](/fs/README.md) From 243316953ed34f040d3172b2b97cf3a8c2904f15 Mon Sep 17 00:00:00 2001 From: benratti Date: Tue, 29 Nov 2022 09:55:33 +0100 Subject: [PATCH 14/37] Update technique-env-fc.md --- fs/technique/technique-env-fc.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/technique/technique-env-fc.md b/fs/technique/technique-env-fc.md index 961f7f1..feaaf3e 100644 --- a/fs/technique/technique-env-fc.md +++ b/fs/technique/technique-env-fc.md @@ -29,7 +29,7 @@ Les adresses de notre environnement d'intégration sont les suivantes : | Authorization | https://auth.integ01.dev-franceconnect.fr/api/v2/authorize | | Token | https://auth.integ01.dev-franceconnect.fr/api/v2/token | | UserInfo | https://auth.integ01.dev-franceconnect.fr/api/v2/userinfo | -| Logout | https://auth.integ01.dev-franceconnect.fr/api/v2/logout | +| Logout | https://auth.integ01.dev-franceconnect.fr/api/v2/session/end | ## Accès à l'environnement de production FranceConnect+ @@ -50,4 +50,4 @@ Les adresses de notre environnement de production sont les suivantes : | Authorization | https://auth.franceconnect.gouv.fr/api/v2/authorize | | Token | https://auth.franceconnect.gouv.fr/api/v2/token | | UserInfo | https://auth.franceconnect.gouv.fr/api/v2/userinfo | -| Logout | https://auth.franceconnect.gouv.fr/api/v2/logout | \ No newline at end of file +| Logout | https://auth.franceconnect.gouv.fr/api/v2/session/end | From b33dd08afdc8d96759b094ddfaf1da93ce3e73cf Mon Sep 17 00:00:00 2001 From: benratti Date: Tue, 29 Nov 2022 10:55:39 +0100 Subject: [PATCH 15/37] Update technique-scope-fc.md --- fs/technique/technique-scope-fc.md | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/fs/technique/technique-scope-fc.md b/fs/technique/technique-scope-fc.md index 42cbf9d..f7a8ff9 100644 --- a/fs/technique/technique-scope-fc.md +++ b/fs/technique/technique-scope-fc.md @@ -40,7 +40,7 @@ Le protocole OpenId Connect defini un certain nombre de [claims standards](https #### Les données d'identité -| Champs | Type | Description | Format | +| Claims | Type | Description | Format | |--------------|--------|-------------|--------| | given_name | string | les prénoms séparés par des espaces (standard OpenIDConnect) | [A-Za-zÀÂÄÇÉÈÊËÎÏÔÖÙÛÜŸàâäçéèêëîïôöùûüÿÆŒæœ -'] | | | family_name | string | le nom de famille de naissance (standard OpenIDConnect) |  [A-ZÀÂÄÇÉÈÊËÎÏÔÖÙÛÜŸÆŒ \-']| | @@ -52,12 +52,27 @@ Le protocole OpenId Connect defini un certain nombre de [claims standards](https ### Les données complémentaires -| Champs | Type | Description | Format | +| Claims | Type | Description | Format | |--------------|--------|-------------|--------| | sub | string | identifiant technique (standard OpenIDConnect) | 66 caractères hexa + lettre 'v' | | email | string | l'adresse électronique de contact de la personne (standard OpenIDConnect) | [RFC 5322](https://xml2rfc.tools.ietf.org/public/rfc/html/rfc5322.html#addrspec) | | preferred_username | string | le nom d'usage (standard OpenIDConnect) | [A-ZÀÂÄÇÉÈÊËÎÏÔÖÙÛÜŸÆŒ \-'] | +### Les données provenant du RNIPP + +L'ensemble des données, hormis le sub, ci-dessus proviennent du fournisseur d'identité et ont le niveau de garantie correspondant ( substantiel ou élevé suivant le fournisseur d'identité ). Afin de faciliter la réconciliation entre les données d'identités mis à disposition par FranceConnect+ et les référentiels de certains FI ( fournisseurs de service publique exclusivement ), des données provenant du RNIPP peuvent également être mise à disposition en fonction du besoin. Attention, le RNIPP ne disposant pas de qualification en tant que MIE, les données provenant du RNIPP n'ont pas de garantie de niveau substantiel ou élevé. Il est donc nécessaire d'utiliser ces données afin de faciliter les réconciliations et uniquement cela. Les données provenant du fournisseurs d'identités doivent être utiliser pour garantir l'identité de l'usager. + + +| Claims | Type | Description | Format | +|--------------|--------|-------------|--------| +| rnipp_given_name | string | les prénoms séparés par des espaces (standard OpenIDConnect) | [A-Za-zÀÂÄÇÉÈÊËÎÏÔÖÙÛÜŸàâäçéèêëîïôöùûüÿÆŒæœ -'] | | +| rnipp_family_name | string | le nom de famille de naissance (standard OpenIDConnect) |  [A-ZÀÂÄÇÉÈÊËÎÏÔÖÙÛÜŸÆŒ \-']| | +| rnipp_birthdate | string | la date de naissance au format YYYY-MM-DD (standard OpenIDConnect) | [ YYYY-01-01 ] - (\d{4})-01-01 - (Présumé mois) [ YYYY-MM-01 ] - (\d{4})-(\d{2})-01 - (Présumé jours) [ YYYY-MM-DD ] - (\d{4})-(\d{2})-(\d{2}) | +| rnipp_gender | string | male pour les hommes, female pour les femmes (standard OpenIDConnect)| Masculin : male Féminin : female |  +| rnipp_birthplace | string | le code INSEE du lieu de naissance sur 5 chiffres (ou une chaîne vide si la personne est née à l'étranger). Une lettre peut être présente pour les personnes nées en corse.| Si né en France (Taille de 5) [(([0-8][0-9AB])|(9[0-8AB]))[0-9]{3}] - [Details](http://xml.insee.fr/schema/cog.html#CodeCommuneFrancaiseOuPaysOuTerritoireEtranger_stype) - [Liste](https://www.insee.fr/fr/information/3363419)
En cas de pays étranger : Champs vide |  +| rnipp_birthcountry | string | le code INSEE du pays de naissance sur 5 chiffres | Pour les pays étrangers (Taille de 5 ) [99[0-9]{3}] - [Details](http://xml.insee.fr/schema/cog.html#CodePaysOuTerritoireEtranger_stype) Pour la France 99100 | + + ### Les données sur l'authentification Les claims relatifs à l'authentification disponible par FranceConnect+ sont des claims standards et sont disponible uniquement dans l'ID Token. Ces claims sont les suivants : @@ -88,3 +103,12 @@ Le tableau suivant décris la liste des *claims* accessible en fonction des *sco | profile | family_name, given_name, preferred_username, gender, birthdate | | birth | birthplace, birthcountry | | identite_pivot |given_name, family_name, birthdate, gender, birthplace, birthcountry | +| rnipp_given_name | given_name, rnipp_given_name | +| rnipp_family_name | family_name, rnipp_family_name | +| rnipp_gender | gender, rnipp_gender | +| rnipp_birthcountry | birthcountry, rnipp_birthcountry | +| rnipp_birthplace | birthplace, rnipp_birthplace | +| rnipp_birthdate | birthdate, rnipp_birthdate | +| rnipp_profile | given_name, family_name, birthdate, gender,preferred_username,rnipp_given_name, rnipp_family_name, rnipp_birthdate, rnipp_gender | +| rnipp_birth | birthplace, birthcountry, rnipp_birthplace, rnipp_birthcountry | +| rnipp_identite_pivot | given_name, family_name, birthdate, gender, birthplace, birthcountry, rnipp_given_name, rnipp_family_name, rnipp_birthdate, rnipp_gender, rnipp_birthplace, rnipp_birthcountry| From 24f6c32036e9ca4f09bcfc0fa1fdcc8bf4d8b0da Mon Sep 17 00:00:00 2001 From: benratti Date: Tue, 29 Nov 2022 10:58:38 +0100 Subject: [PATCH 16/37] Update projet-donnees-fc+.md --- fs/projet/projet-donnees-fc+.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/projet/projet-donnees-fc+.md b/fs/projet/projet-donnees-fc+.md index 5a1ec96..2a434c4 100644 --- a/fs/projet/projet-donnees-fc+.md +++ b/fs/projet/projet-donnees-fc+.md @@ -25,4 +25,4 @@ FranceConnect+ transmet systématiquement au Fournisseur de Service un identifia * Cet identifiant est le même quelque soit le Fournisseur d'Identité qui est utilisé par l'utilisateur. * Cet identifiant n'est amené à changer quand dans le cas particulier où l'utilisateur a fait modifié ses données d'état civil. Dans tous les autres cas, cet identifiant sera systématiquement le même. -Les données d'identité fournies au fournisseur de service sont celles directement issues du fournisseur d'identité choisi par l'utilisateur. Ces données peuvent donc légèrement varier d'un fournisseur d'identité à l'autre, nous préconisons donc de réaliser le rapprochement/réconciliation sur la base de l'identifiant unique de l'utilisateur fourni par FranceConnect+. \ No newline at end of file +Les données d'identité fournies au fournisseur de service sont celles directement issues du fournisseur d'identité choisi par l'utilisateur. Ces données peuvent donc légèrement varier d'un fournisseur d'identité à l'autre, nous préconisons donc de réaliser le rapprochement/réconciliation sur la base de l'identifiant unique de l'utilisateur fourni par FranceConnect+. Il est également possible de récupérer des données provenant du RNIPP en complément des données d'identités provenant du fournisseur d'identité. Cependant, ces données ne disposent pas du niveau de garantie substantiel ou élevé et doivent être utilisé uniquement pour faciliter le rapprochement/réconciliation. From 84663b90edd6f6a04dc133623b6b0dc6587cbf82 Mon Sep 17 00:00:00 2001 From: Benjamin Ratti Date: Wed, 30 Nov 2022 14:56:45 +0100 Subject: [PATCH 17/37] docs(fs) : ajout page bouton fc+ --- fs/README.md | 14 +++----- fs/technique/FranceConnect-Plus-Boutons.zip | Bin 0 -> 248174 bytes fs/technique/technique-boutons-fc.md | 36 ++++++++++++++++++++ 3 files changed, 40 insertions(+), 10 deletions(-) create mode 100644 fs/technique/FranceConnect-Plus-Boutons.zip create mode 100644 fs/technique/technique-boutons-fc.md diff --git a/fs/README.md b/fs/README.md index 4a46e22..c267a00 100644 --- a/fs/README.md +++ b/fs/README.md @@ -44,25 +44,19 @@ Vous avez lancé un projet pour devenir FranceConnect+ et vous souhaiter connait - [Comment utiliser les scopes OpenID Connect pour accéder aux données des utilisateurs ? ](technique/technique-scope-fc.md) +## Je veux connaitre les règles d'intégration du bouton dans mon service -## Réaliser des tests avant de soumettre sa demande d'habilitation - -Un fournisseur de Service de démonstration est disponible à l'adresse [fsp1v2.integ01.dev-franceconnect.fr](https://fsp1v2.integ01.dev-franceconnect.fr//). +- [Quel visuel utiliser pour les boutons FranceConnect?](technique/technique-boutons-fc.md) +## Réaliser des tests avant de soumettre sa demande d'habilitation +Un fournisseur de Service de démonstration est disponible à l'adresse [fsp1v2.integ01.dev-franceconnect.fr](https://fsp1v2.integ01.dev-franceconnect.fr//). -# Intégration d'un bouton FranceConnect+ -Les boutons d’action FranceConnect+ sont primordiaux dans l’usage du service. Il est obligatoire d’utiliser l’un des boutons proposé et aucun autre visuel pour la connexion des usagers. -Pour les boutons en svg, lors de l'utilisation d'une image veuillez préciser la taille du bouton. -Téléchargements : -* Pack SVG -* Pack PNG -* Pack JPG diff --git a/fs/technique/FranceConnect-Plus-Boutons.zip b/fs/technique/FranceConnect-Plus-Boutons.zip new file mode 100644 index 0000000000000000000000000000000000000000..bd711b847dfc52cac1155c802af7278231bdc3d4 GIT binary patch literal 248174 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 z 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 z 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%0AR38h}(ZK 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 Date: Thu, 1 Dec 2022 11:42:59 +0100 Subject: [PATCH 18/37] doc(fs) : modification sur oidc --- fs/README.md | 45 +---------------------- fs/technique/technique-eidas.md | 57 +++++++++++++++++++++++++++++ fs/technique/technique-oidc-fc.md | 4 ++ fs/technique/technique-oidc-flux.md | 23 ++++++++++++ 4 files changed, 86 insertions(+), 43 deletions(-) create mode 100644 fs/technique/technique-eidas.md create mode 100644 fs/technique/technique-oidc-flux.md diff --git a/fs/README.md b/fs/README.md index c267a00..06f8995 100644 --- a/fs/README.md +++ b/fs/README.md @@ -42,11 +42,12 @@ Vous avez lancé un projet pour devenir FranceConnect+ et vous souhaiter connait - [Comment accéder aux différents environnements de FranceConnect+ ?](technique/technique-env-fc.md) - [Comment utiliser les scopes OpenID Connect pour accéder aux données des utilisateurs ? ](technique/technique-scope-fc.md) +- [Comment utiliser les niveaux de garantie eIDAS sur FranceConnect+ ?](technique/technique-eidas.md) ## Je veux connaitre les règles d'intégration du bouton dans mon service -- [Quel visuel utiliser pour les boutons FranceConnect?](technique/technique-boutons-fc.md) +- [Comment intégrer le boutons FranceConnect+ à mon service ?](technique/technique-boutons-fc.md) ## Réaliser des tests avant de soumettre sa demande d'habilitation @@ -56,48 +57,6 @@ Un fournisseur de Service de démonstration est disponible à l'adresse [fsp1v2 - - - - -## Détail du fonctionnement - -drawing - - - -La récupération de l'identité pivot doit être faite dans la suite immédiate des appels précédents (authentification et récupération du code). Le fait d'appeler ce Web service plus tard n'est aujourd'hui pas proposé. - - -## Utiliser les niveaux eIDAS en tant que FS - -EIDAS est un standard européen visant à normaliser et à améliorer la sécurité de l'identification sur Internet. Il propose notamment 3 niveaux de garantie sur les moyens utilisés pour l'identification. Vous pouvez, en tant que Fournisseur de Service, utiliser les niveaux eIDAS afin de récupérer une identité avec le niveau de garantie correspondant à votre besoin. - -Comme la norme ne prévoit pas aujourd'hui de mesures techniques particulières pour préciser le niveau souhaité, FranceConnect+ utilise le claim optionnel "acr" (http://openid.net/specs/openid-connect-basic-1_0.html#RequestParameters) de la norme OpenID Connect. Pour le Fournisseur de Service, cela veut dire remplir le claim optionnel acr_values lors de la demande d'authentification (appel à l'endpoint /api/v2/authorize). - -Au sujet du claim acr_values, on notera que c'est, selon la norme, un "voluntary claim" qui théoriquement traduit une préférence et non une exigence. Lorsque ce claim est fourni, FranceConnect+ ne proposera à l'utilisateur que les Fournisseurs d'Identité pouvant satisfaire le niveau eIDAS demandé. En retour, le Fournisseur d'Identité renverra par le biais de FranceConnect+ le niveau eIDAS avec lequel l'authentification a eu lieu. Le Fournisseur de Service doit vérifier le niveau eIDAS utilisé afin de s'assurer que celui-ci est bien conforme au niveau eIDAS attendu. - -Exemple d'appel précisant un niveau eIDAS minimum : - -``` -https://fcp.integ01.dev-franceconnect.fr/api/v2/authorize?response_type=code&client_id=123456&redirect_uri=https%3A%2F%2Ffournisseur-de-service.dev-franceconnect.fr%2Flogin-callback&scope=openid%20profile%20email%20address%20phone%20preferred_username%20email%20address%20phone%20preferred_username&acr_values=eidas1&state=randomValue&nonce=randomValue -``` - -Afin d'y arriver, il faut spécifier une ou plusieurs valeurs parmi les suivantes : - -* eidas2 : niveau substantiel -* eidas3 : niveau élevé - - -Si le claim acr n'est pas précisé, le niveau par défaut est fixé à eidas3, le plus sécurisé. -Si le claim est précisé, FranceConnect+ ne proposera à l'utilisateur que les fournisseurs d'identité de niveau supérieur ou égal. Sinon, FranceConnect+ ne proposera à l'utilisateur que les Fournisseurs d'Identité de niveau élevé. -Si plusieurs niveaux sont précisés, FranceConnect+ prend en compte le niveau le plus bas. -Si le claim est considéré par FranceConnect+ comme n'étant pas valide, le niveau par défaut est utilisé. -Le niveau eIDAS utilisé pour l'authentification est retourné par le fournisseur d'identité (cf la documentation du FI), par le biais de FranceConnect+ (qui le transmet sans le modifier) et du claim acr dans l'ID Token retourné au Fournisseur de Service. - -Il est de la responsabilité du Fournisseur de service de s'assurer que le niveau retourné est au moins égal ou supérieur à celui demandé (si eidas2 est demandé, eidas3 doit être accepté tout comme eidas2). - - # Je veux déconnecter l'utilisateur de FranceConnect Pour les niveaux Substantiel et Elevé, FranceConnect+ ne gère pas de session utilisateur et demande systématique à l'utilisateur de se ré-authentifier auprès d'un Founisseur d'Identité. diff --git a/fs/technique/technique-eidas.md b/fs/technique/technique-eidas.md new file mode 100644 index 0000000..a8489da --- /dev/null +++ b/fs/technique/technique-eidas.md @@ -0,0 +1,57 @@ + +--- + +# Comment utiliser les niveaux de garantie eIDAS sur FranceConnect+ ? + +## Les niveaux eIDAS disponible sur la plateforme FranceConnect+ + +La plaforme FranceConnect+ est qualifié pour fournir des identités de niveau de garantie eIDAS substantiel et élevé. Le niveau de garantie faible n'est pas supporté. Si vous souhaitez obtenir des identités ayant un niveau de garantie faible, vous devez pour cela utiliser la plateforme FranceConnect. + +## Spécifier un niveau de garantie eIDAS souhaité lors de la cinématique FranceConnect+ ? + +### Utilisation du paramètre *acr_values* + +FranceConnect+ s'appuie sur le paramètre *acr_values* de la norme [OpenID Connect](http://openid.net/specs/openid-connect-basic-1_0.html#RequestParameters) pour permettre de préciser le niveau de garantie attendu par votre fournisseur de service. Il s'agit d'un paramètre optionnel. Si celui-ci n'est pas indiqué dans les paramètre de la requête, alors c'est le niveau de garantie le plus élevé supporté par la plateforme qui sera pris en compte, c'est à dire le niveau élevé. + +Les valeurs du paramètre à indiquer en fonction du niveau de garantie souhaitez sont les suivantes : + +- eidas2 : niveau substantiel +- eidas3 : niveau élevé + +Exemple d'appel précisant un niveau eIDAS minimum : + +``` +https://fcp.integ01.dev-franceconnect.fr/api/v2/authorize?response_type=code&client_id=123456&redirect_uri=https%3A%2F%2Ffournisseur-de-service.dev-franceconnect.fr%2Flogin-callback&scope=openid%20profile%20email%20address%20phone%20preferred_username%20email%20address%20phone%20preferred_username&state=randomValue&nonce=randomValue&acr_values=eidas2 +``` + +A noter que si la valeur du paramètre *acr_values* est *eidas1*, FranceConnect+ retournera une erreur indiquant que le niveau de garantie demandé n'est pas supporté par la plateforme FranceConnect+. Cette valeur correspond au niveau de garantie faible et est supporté exclusivement par la plateforme FranceConnect. + +Toute valeur différente de *eidas1*, *eidas2* et *eidas3* sera ignoré. + + +### Impact pour l'utilisateur. + +Lorsqu'un niveau de garantie eIDAS est demandé, alors l'utilisateur ne se verra proposer que les fournisseurs d'identités qui peuvent satisfaire sa demande. + +Ainsi, si le niveau demandé est *eidas2*, alors tous les fournisseurs d'identités disponible sur FranceConnect+ seront proposés à l'utilisateur. Si le niveau demandé est *eidas3*, alors seuls les fournisseurs d'identités pouvant fournir des identités de niveau élevé seront proposé à l'utilisateur. + +## Contrôler le niveau de garantie de l'identité récupérée + +Le niveau de garantie de l'identité récupéré auprès de FranceConnect+ est indiqué dans le claim *acr* présent dans l'[ID Token](https://openid.net/specs/openid-connect-basic-1_0.html#IDToken). + +Comme indiqué dans la norme [OpenID Connect](https://openid.net/specs/openid-connect-basic-1_0.html#IDTokenValidation), votre fournisseur de service doit s'assurer que le niveau de garantie de l'identité récupéré auprès de FranceConnect+ est bien conforme à celui attendu. + +Les valeurs possible pour le claim *acr* sont les suivantes : + +- eidas2 : niveau substantiel +- eidas3 : niveau élevé + + +Il est de la responsabilité du Fournisseur de service de s'assurer que le niveau retourné est au moins égal ou supérieur à celui demandé (si eidas2 est demandé, eidas3 doit être accepté tout comme eidas2). + +--- + +Voir aussi : + +- [Qu'est ce qu'eIDAS et quels sont les niveaux de garantie de FranceConnect+ ?](../projet/projet-niveau-eidas.md) +- [Comment FranceConnect+ utilise le protocole OpenId Connect ? ](technique-oidc.md) \ No newline at end of file diff --git a/fs/technique/technique-oidc-fc.md b/fs/technique/technique-oidc-fc.md index 9a66d9c..925cd70 100644 --- a/fs/technique/technique-oidc-fc.md +++ b/fs/technique/technique-oidc-fc.md @@ -99,5 +99,9 @@ Les clés publiques de chiffrement du fournisseur de service doivent être expos [Plus d'information sur le JWK](https://datatracker.ietf.org/doc/html/rfc7517) +--- +Voir aussi : +- [Qu'est ce que le protocole OpenID Connect ?](technique-oidc.md) +- [Quels échanges ont lieu entre mon service et FranceConnect+ lors d'une cinématique ?](technique-oidc-flux.md) diff --git a/fs/technique/technique-oidc-flux.md b/fs/technique/technique-oidc-flux.md new file mode 100644 index 0000000..caf109e --- /dev/null +++ b/fs/technique/technique-oidc-flux.md @@ -0,0 +1,23 @@ + +--- + +# Quels échanges ont lieu entre mon service et FranceConnect+ lors d'une cinématique ? + + +## Détail du fonctionnement + +Le diagramme de flux représente entre l'utilisateur, FranceConnect+ et votre service est le suivant. + + + +drawing + + +La récupération de l'identité pivot doit être faite dans la suite immédiate des appels précédents (authentification et récupération du code). Le fait d'appeler ce Web service plus tard n'est aujourd'hui pas proposé. + +--- + +Voir aussi : + +- [Comment FranceConnect+ utilise le protocole OpenId Connect ?](technique-oidc-fc.md) +- [Qu'est ce que le protocole OpenID Connect ?](technique-oidc.md) \ No newline at end of file From b6d03039a588433cc0e5828400f5530878ca6967 Mon Sep 17 00:00:00 2001 From: Benjamin Ratti Date: Thu, 1 Dec 2022 12:06:01 +0100 Subject: [PATCH 19/37] doc(fs) : modification pilotage + projet --- fs/README.md | 9 ++------ fs/donnees-usagers.md | 22 ------------------- fs/pilotage/piloge-fi.md | 15 +++++++++++++ fs/pilotage/pilotage-integrer-fc+-apres-fc.md | 4 ++-- fs/projet/projet-donnees-fc+.md | 6 +++++ fs/projet/projet-tests-sans-datapass.md | 12 ++++++++++ fs/technique/technique-oidc-fc.md | 2 +- 7 files changed, 38 insertions(+), 32 deletions(-) delete mode 100644 fs/donnees-usagers.md create mode 100644 fs/pilotage/piloge-fi.md create mode 100644 fs/projet/projet-tests-sans-datapass.md diff --git a/fs/README.md b/fs/README.md index 06f8995..eaedc58 100644 --- a/fs/README.md +++ b/fs/README.md @@ -18,6 +18,7 @@ Vous souhaitez devenir Fournisseur de Service pour FranceConnect+, voici les que * [Quelles sont les étapes pour devenir Fournisseur de Service ?](pilotage/pilotage-etapes.md) * [Quels sont les différents acteurs que je dois faire intervenir dans mon organisation pour devenir Fournisseur de Service ?](pilotage/pilotage-demarches-acteurs.md) * [Quelles sont les différences entre FranceConnect et FranceConnect+ ?](pilotage/pilotage-differences-fc-fc+.md) +* [Quels sont les fournisseurs d'identités disponible sur FranceConnect+ ? ](pilotage/piloge-fi.md) * [Je suis déjà Fournisseur de Service pour FranceConnect, que dois je faire en plus pour devenir Fournisseur de Service pour FranceConnect+ ?](pilotage/pilotage-integrer-fc+-apres-fc.md) @@ -30,6 +31,7 @@ Vous avez lancé un projet pour devenir FranceConnect+ et vous souhaiter connait - [Quelles sont les données que je peux récupérer par FranceConnect+ sur mes usagers ?](projet/projet-donnees-fc+.md) - [Qu'est ce qu'eIDAS et quels sont les niveaux de garantie de FranceConnect+ ?](projet/projet-niveau-eidas.md) - [Quel est l'écosystème de FranceConnect+ ?](projet/projet-ecosysteme-fc+.md) +- [Comment puis-je réaliser des tests de FranceConnect+ avant de soumettre ma demande d'habilitation ?](projet-tests-sans-datapass.md) # J'intègre FranceConnect+ dans mon service en ligne @@ -50,13 +52,6 @@ Vous avez lancé un projet pour devenir FranceConnect+ et vous souhaiter connait - [Comment intégrer le boutons FranceConnect+ à mon service ?](technique/technique-boutons-fc.md) -## Réaliser des tests avant de soumettre sa demande d'habilitation - -Un fournisseur de Service de démonstration est disponible à l'adresse [fsp1v2.integ01.dev-franceconnect.fr](https://fsp1v2.integ01.dev-franceconnect.fr//). - - - - # Je veux déconnecter l'utilisateur de FranceConnect Pour les niveaux Substantiel et Elevé, FranceConnect+ ne gère pas de session utilisateur et demande systématique à l'utilisateur de se ré-authentifier auprès d'un Founisseur d'Identité. diff --git a/fs/donnees-usagers.md b/fs/donnees-usagers.md deleted file mode 100644 index da61f41..0000000 --- a/fs/donnees-usagers.md +++ /dev/null @@ -1,22 +0,0 @@ -# Les données usagers -Les données usagers sont fournies par les Fournisseurs d'Identité aux Fournisseurs de Service, via FranceConnect, conformément à l'habilitation obtenue via [datapass.api.gouv.fr](https://datapass.api.gouv.fr), et le choix des données réalisé par le fournisseur de service dans cette demande. - -L'identité pivot permet d'identifier un utilisateur particulier. - -* Nom de naissance -* Prénoms -* Sexe -* Date de naissance -* Code géographique INSEE de la ville de naissance -* Code géographique INSEE du pays de naissance - -En complément, il est possible d'obtenir le nom d'usage. Cependant cette donnée n'est pas obligatoirement connue par tous les Fournisseurs d'Identité. - -Vous pouvez avoir accès également à l'adresse email. Cette donnée de contact a également été vérifiée par le Fournisseur d'identité. Il est à remarquer que la donnée "adresse email" peut différer selon le Fournisseur d'Identité choisi par l'usager. - -FranceConnect transmet systématiquement au Fournisseur de Service un identifiant unique pour chaque utilisateur : - -* Cet identifiant est spécifique à chaque Fournisseur de Service. Un même utilisateur aura donc un identifiant unique différent pour chacun des Fournisseurs de Service auxquels il accède. -* Cet identifiant est le même quelque soit le Fournisseur d'Identité qui est utilisé par l'utilisateur. - -A noter que pour les niveaux de garantie d'identité eIDAS 2 et 3 (substantiel et élevé), les données d'identité fournies au fournisseur de service sont celles directement issues du fournisseur d'identité choisi par l'utilisateur, sans redressement RNIPP (INSEE). Ces données peuvent donc légèrement varier d'un fournisseur d'identité à l'autre, nous préconisons donc de réaliser le rapprochement/réconciliation sur la base de l'identifiant unique de l'utilisateur fourni par FranceConnect. \ No newline at end of file diff --git a/fs/pilotage/piloge-fi.md b/fs/pilotage/piloge-fi.md new file mode 100644 index 0000000..0a10ad3 --- /dev/null +++ b/fs/pilotage/piloge-fi.md @@ -0,0 +1,15 @@ + +--- + +# Quels sont les fournisseurs d'identités disponible sur FranceConnect+ ? + +La liste des fournisseurs d'identité est disponible sur le site internet de [FranceConnect+](https://franceconnect.gouv.fr/france-connect-plus). Il s'agit exclusivement de fournisseurs d'identité qualifié par l'ANSSI pour les niveau de garantie substantiel et élevé. + +En complément des fournisseurs d'identité, FranceConnect+ propose également une connection à la passerelle européenne eIDAS, permettant l'accès à votre fournisseu de service à des citoyens des autres états membres européens. Ceci est une obligation pour les fournisseurs de service publics utilisant FranceConnect+ et optionnel pour les fournisseurs de service privés. + + +--- + +Voir aussi : + +- [Qu'est ce qu'eIDAS et quels sont les niveaux de garantie de FranceConnect+ ?](../projet/projet-niveau-eidas.md) \ No newline at end of file diff --git a/fs/pilotage/pilotage-integrer-fc+-apres-fc.md b/fs/pilotage/pilotage-integrer-fc+-apres-fc.md index 664ed95..9eedb41 100644 --- a/fs/pilotage/pilotage-integrer-fc+-apres-fc.md +++ b/fs/pilotage/pilotage-integrer-fc+-apres-fc.md @@ -12,8 +12,8 @@ L'intégration de FranceConnect+ en tant que Fournisseur de Service est légère - des URLs différentes pour accéder aux environnements; - des secrets différents pour chacun des environnements (intégration, production) - un chiffrement et un signature sur les jetons transmis -- une utilisation de mode discovery d'OpenId Connect +- une utilisation de mode discovery d'OpenID Connect - une exposition des clés publiques de chiffrement et de signature -Les plateformes FranceConnect et FranceConnect+ reposent toutes les deux sur le même protocole, à savoir OpenId Connect. Hormis les différences cités ci dessus, leur fonctionnement est similaire. Ainsi les intégrations de FranceConnect et FranceConnect+ sont très similaire et ne nécessite pas pour un Fournisseur de Service une charge d'intégration important pour devenir Fournisseur de Service pour FranceConnect+ si vous l'êtes déjà pour FranceConnect. \ No newline at end of file +Les plateformes FranceConnect et FranceConnect+ reposent toutes les deux sur le même protocole, à savoir [OpenID Connect](https://openid.net/connect/). Hormis les différences cités ci dessus, leur fonctionnement est similaire. Ainsi les intégrations de FranceConnect et FranceConnect+ sont très similaire et ne nécessite pas pour un Fournisseur de Service une charge d'intégration important pour devenir Fournisseur de Service pour FranceConnect+ si vous l'êtes déjà pour FranceConnect. \ No newline at end of file diff --git a/fs/projet/projet-donnees-fc+.md b/fs/projet/projet-donnees-fc+.md index 2a434c4..1e02c4e 100644 --- a/fs/projet/projet-donnees-fc+.md +++ b/fs/projet/projet-donnees-fc+.md @@ -26,3 +26,9 @@ FranceConnect+ transmet systématiquement au Fournisseur de Service un identifia * Cet identifiant n'est amené à changer quand dans le cas particulier où l'utilisateur a fait modifié ses données d'état civil. Dans tous les autres cas, cet identifiant sera systématiquement le même. Les données d'identité fournies au fournisseur de service sont celles directement issues du fournisseur d'identité choisi par l'utilisateur. Ces données peuvent donc légèrement varier d'un fournisseur d'identité à l'autre, nous préconisons donc de réaliser le rapprochement/réconciliation sur la base de l'identifiant unique de l'utilisateur fourni par FranceConnect+. Il est également possible de récupérer des données provenant du RNIPP en complément des données d'identités provenant du fournisseur d'identité. Cependant, ces données ne disposent pas du niveau de garantie substantiel ou élevé et doivent être utilisé uniquement pour faciliter le rapprochement/réconciliation. + +--- + +Voir aussi : + +- [Comment utiliser les scopes OpenID Connect pour accéder aux données des utilisateurs ? ](../technique/technique-scope-fc.md) \ No newline at end of file diff --git a/fs/projet/projet-tests-sans-datapass.md b/fs/projet/projet-tests-sans-datapass.md new file mode 100644 index 0000000..33a4003 --- /dev/null +++ b/fs/projet/projet-tests-sans-datapass.md @@ -0,0 +1,12 @@ + +--- + +# Comment puis-je réaliser des tests de FranceConnect+ avant de soumettre ma demande d'habilitation ? + +Contrairement à la plateforme FranceConnect, il est nécessaire d'avoir sa demande d'habilitation (datapass) validée avant de pouvoir utiliser la plateforme FranceConnect+. + +--- + +Voir aussi : + +- [Quelles sont les étapes pour devenir Fournisseur de Service ? ](../pilotage/pilotage-etapes.md) \ No newline at end of file diff --git a/fs/technique/technique-oidc-fc.md b/fs/technique/technique-oidc-fc.md index 925cd70..39ec818 100644 --- a/fs/technique/technique-oidc-fc.md +++ b/fs/technique/technique-oidc-fc.md @@ -44,7 +44,7 @@ FranceConnect+ permet de récupérer différents types de jetons : | Jeton | Format | | --- | --- | | *access token* | chaine de caractères | -| *id_tokent* | JWT |  +| *id_token* | JWT |  | *user info* | JWT |  L'ensemble de jetons JWT fournis par FranceConnect+, c'est à dire l'ID Token et les *User Info* sont chiffrés et signés afin de garantir un niveau de confidentialité et d'intégrité afin de satisfaire les exigences des niveaux de garantie subtantiel et élévée défini dans le règlement eIDAS. From c6fa51454bcc110baf6a915bae5bc9a4f4b49b5d Mon Sep 17 00:00:00 2001 From: Benjamin Ratti Date: Thu, 1 Dec 2022 13:48:09 +0100 Subject: [PATCH 20/37] =?UTF-8?q?docs(fs)=20:=20am=C3=A9lioration=20fs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fs/README.md | 3 ++- fs/pilotage/pilotage-demarches-acteurs.md | 2 +- fs/pilotage/pilotage-integrer-fc+-apres-fc.md | 15 +++++++++++- fs/projet/projet-datapass.md | 24 +++++++++++++++++++ fs/projet/projet-tests-sans-datapass.md | 3 ++- fs/technique/technique-boutons-fc.md | 2 +- fs/technique/technique-env-fc.md | 19 +++++++++++++++ 7 files changed, 63 insertions(+), 5 deletions(-) create mode 100644 fs/projet/projet-datapass.md diff --git a/fs/README.md b/fs/README.md index eaedc58..d821be1 100644 --- a/fs/README.md +++ b/fs/README.md @@ -32,6 +32,7 @@ Vous avez lancé un projet pour devenir FranceConnect+ et vous souhaiter connait - [Qu'est ce qu'eIDAS et quels sont les niveaux de garantie de FranceConnect+ ?](projet/projet-niveau-eidas.md) - [Quel est l'écosystème de FranceConnect+ ?](projet/projet-ecosysteme-fc+.md) - [Comment puis-je réaliser des tests de FranceConnect+ avant de soumettre ma demande d'habilitation ?](projet-tests-sans-datapass.md) +- [Comment effectuer ma demande d'habilitation pour FranceConnect+ ?](../projet/projet-datapass.md) # J'intègre FranceConnect+ dans mon service en ligne @@ -49,7 +50,7 @@ Vous avez lancé un projet pour devenir FranceConnect+ et vous souhaiter connait ## Je veux connaitre les règles d'intégration du bouton dans mon service -- [Comment intégrer le boutons FranceConnect+ à mon service ?](technique/technique-boutons-fc.md) +- [Comment intégrer le bouton FranceConnect+ à mon service ?](technique/technique-boutons-fc.md) # Je veux déconnecter l'utilisateur de FranceConnect diff --git a/fs/pilotage/pilotage-demarches-acteurs.md b/fs/pilotage/pilotage-demarches-acteurs.md index 16b224e..fa44d4e 100644 --- a/fs/pilotage/pilotage-demarches-acteurs.md +++ b/fs/pilotage/pilotage-demarches-acteurs.md @@ -2,7 +2,7 @@ --- -# Quels sont les acteurs à impliquer dans l'intégration de FranceConnect+ +# Quels sont les acteurs à impliquer dans l'intégration de FranceConnect+ ? Pour devenir Fournisseur de Service de FranceConnect+, il est nécessaire de designé des personnes remplissants les rôles suivants : Responsable de traitement, Délégué à la protection des données, Responsable technique, Responsable de la Sécurité du Système d'Information. diff --git a/fs/pilotage/pilotage-integrer-fc+-apres-fc.md b/fs/pilotage/pilotage-integrer-fc+-apres-fc.md index 9eedb41..c67bc8a 100644 --- a/fs/pilotage/pilotage-integrer-fc+-apres-fc.md +++ b/fs/pilotage/pilotage-integrer-fc+-apres-fc.md @@ -4,6 +4,13 @@ # Je suis déjà Fournisseur de Service pour FranceConnect, que dois je faire en plus pour devenir Fournisseur de Service pour FranceConnect+ ? +## Demande d'habilitation + +Même si vous êtes déjà fournisseur de service FranceConnect, il est nécessaire de faire une demande d'habilitation spécifique à FranceConnect+ via [datapass](https://datapass.api.gouv.fr/franceconnect/). Lors de votre demande, veuillez à bien indiquer que votre demande FranceConnect+ dans la section *Niveau de garantie attendu par votre service*. + + +## Intégration + FranceConnect+ étant une plateforme différente de FranceConnect, il est nécessaire de réaliser une intégration de FranceConnect+, en complément de l'intégration de FranceConnect. Vous devez donc suivre l'ensemble des étapes pour devenir Fournisseur de Service. L'intégration de FranceConnect+ en tant que Fournisseur de Service est légèrement différente de celle de FranceConnect car elle nécessite des mesures de sécurités supplémentaires afin de répondre à des exigences de sécurité spécifiques aux niveaux de garantie subtantiel et élevé. Vos équipes de développement devront par conséquent réaliser des évolutions pour pouvoir s'intégrer à FranceConnect+. Les différences principales par rapport à FranceConnect sont les suivants: @@ -16,4 +23,10 @@ L'intégration de FranceConnect+ en tant que Fournisseur de Service est légère - une exposition des clés publiques de chiffrement et de signature -Les plateformes FranceConnect et FranceConnect+ reposent toutes les deux sur le même protocole, à savoir [OpenID Connect](https://openid.net/connect/). Hormis les différences cités ci dessus, leur fonctionnement est similaire. Ainsi les intégrations de FranceConnect et FranceConnect+ sont très similaire et ne nécessite pas pour un Fournisseur de Service une charge d'intégration important pour devenir Fournisseur de Service pour FranceConnect+ si vous l'êtes déjà pour FranceConnect. \ No newline at end of file +Les plateformes FranceConnect et FranceConnect+ reposent toutes les deux sur le même protocole, à savoir [OpenID Connect](https://openid.net/connect/). Hormis les différences cités ci dessus, leur fonctionnement est similaire. Ainsi les intégrations de FranceConnect et FranceConnect+ sont très similaire et ne nécessite pas pour un Fournisseur de Service une charge d'intégration important pour devenir Fournisseur de Service pour FranceConnect+ si vous l'êtes déjà pour FranceConnect. + +## Identifiant commun à FranceConnect et FranceConnect+ + +FranceConnect et FranceConnect+ fournissent un identifiant technique permettant d'identifier de manière unique un utilisateur pour votre service. Par défaut, cette identifiant est différent sur les deux plateforme. Il vous est possible, si vous en avez le besoin, de recevoir le même identifiant pour un même utilisateur pour votre service pour les deux plateformes. + +Pour pouvoir en bénéficier, il suffit de le préciser lors de votre demande de création de votre fournisseur de service. \ No newline at end of file diff --git a/fs/projet/projet-datapass.md b/fs/projet/projet-datapass.md new file mode 100644 index 0000000..20e2ea8 --- /dev/null +++ b/fs/projet/projet-datapass.md @@ -0,0 +1,24 @@ + + +--- + +# Comment effectuer ma demande d'habilitation pour FranceConnect+ ? + +Pour pouvoir utiliser FranceConnect+, il est nécessaire de faire une demande d'habilitation au travers de l'outils [datapass](https://datapass.api.gouv.fr/franceconnect/) mis à disposition par la DINUM. + +Vous aurez besoin de renseigners les informations suivantes : + +- Informations du votre organisation +- Description du projet +- Les données auxquelles vous souhaitez avoir accès +- Le niveau de garantie attendu par votre service - pensez à préciser FranceConnect+ +- Le cadre juridique +- Les personnes impliquées (responsable de traitement, délégué à la protection des données, responsable technique). + +--- + +Voir aussi : + +- [Quelles sont les étapes pour devenir Fournisseur de Service ?](../pilotage/pilotage-etapes.md) +- [Comment puis-je réaliser des tests de FranceConnect+ avant de soumettre ma demande d'habilitation ?](projet-tests-sans-datapass.md) +- [Quels sont les acteurs à impliquer dans l'intégration de FranceConnect+ ?](../pilotage/pilotage-demarches-acteurs.md) diff --git a/fs/projet/projet-tests-sans-datapass.md b/fs/projet/projet-tests-sans-datapass.md index 33a4003..78752c7 100644 --- a/fs/projet/projet-tests-sans-datapass.md +++ b/fs/projet/projet-tests-sans-datapass.md @@ -9,4 +9,5 @@ Contrairement à la plateforme FranceConnect, il est nécessaire d'avoir sa dema Voir aussi : -- [Quelles sont les étapes pour devenir Fournisseur de Service ? ](../pilotage/pilotage-etapes.md) \ No newline at end of file +- [Quelles sont les étapes pour devenir Fournisseur de Service ? ](../pilotage/pilotage-etapes.md) +- [Comment effectuer ma demande d'habilitation pour FranceConnect+ ?](./projet-datapass.md) \ No newline at end of file diff --git a/fs/technique/technique-boutons-fc.md b/fs/technique/technique-boutons-fc.md index 6547b65..b8dc71d 100644 --- a/fs/technique/technique-boutons-fc.md +++ b/fs/technique/technique-boutons-fc.md @@ -1,4 +1,4 @@ -# Comment intégrer le boutons FranceConnect+ à mon service ? +# Comment intégrer le bouton FranceConnect+ à mon service ? En fonction du type de service, il existe deux intégration possible du bouton FranceConnect+ : diff --git a/fs/technique/technique-env-fc.md b/fs/technique/technique-env-fc.md index feaaf3e..d81bac9 100644 --- a/fs/technique/technique-env-fc.md +++ b/fs/technique/technique-env-fc.md @@ -12,6 +12,12 @@ FranceConnect met à disposition deux environnements : ## Accès à l'environnement d'intégration FranceConnect+ +# Récupération des clés d'intégration + +Pour accéder à l'intégration, après validation de votre demande d'habilitation, vous devez effectuer une [demande de création d'un fournisseur de service pour FranceConnect+](https://www.demarches-simplifiees.fr/commencer/demande-de-creation-d-un-fs-fc-plus). + +## Accès à l'environnement d'intégration + Pour vous permettre de réaliser les développements liés à l'intégration de FranceConnect, nous mettons à disposition un environnement d'intégration. Les accès à cet environnement se font à travers des clés qui vous sont communiquées sur votre espace partenaire. Pour utiliser l'environnement d'intégration, il faut au préalable avoir : @@ -33,6 +39,12 @@ Les adresses de notre environnement d'intégration sont les suivantes : ## Accès à l'environnement de production FranceConnect+ +# Récupération des clés de production + +Pour accéder à l'intégration, après qualification de votre intégration de FranceConnect+ dans votre service, vous devez effectuer une [demande de création d'un fournisseur de service pour FranceConnect+](https://www.demarches-simplifiees.fr/commencer/demande-de-creation-d-un-fs-fc-plus). + +## Accès à l'environnement de production + Pour avoir accès à l'environnement de production FranceConnect+, il faut au préalable avoir : 1. Reçu la qualification de vos développements par FranceConnect+ sur un environnement autre que votre production. @@ -51,3 +63,10 @@ Les adresses de notre environnement de production sont les suivantes : | Token | https://auth.franceconnect.gouv.fr/api/v2/token | | UserInfo | https://auth.franceconnect.gouv.fr/api/v2/userinfo | | Logout | https://auth.franceconnect.gouv.fr/api/v2/session/end | + + +--- + +Voir aussi : + +- [Comment effectuer ma demande d'habilitation pour FranceConnect+ ?](../projet/projet-datapass.md) \ No newline at end of file From 40291aa6d19e65335291824b6975b45c10034a2e Mon Sep 17 00:00:00 2001 From: Benjamin Ratti Date: Thu, 1 Dec 2022 14:00:25 +0100 Subject: [PATCH 21/37] docs(fs) : ajout de header dans la parte technique --- fs/projet/projet-donnees-fc+.md | 4 ++-- fs/technique/technique-boutons-fc.md | 4 ++++ fs/technique/technique-eidas.md | 3 ++- fs/technique/technique-env-fc.md | 2 +- fs/technique/technique-oidc-fc.md | 4 ++-- fs/technique/technique-oidc-flux.md | 1 + fs/technique/technique-oidc.md | 17 +++++++++++++++-- fs/technique/technique-scope-fc.md | 10 +++++++++- 8 files changed, 36 insertions(+), 9 deletions(-) diff --git a/fs/projet/projet-donnees-fc+.md b/fs/projet/projet-donnees-fc+.md index 1e02c4e..f5241f0 100644 --- a/fs/projet/projet-donnees-fc+.md +++ b/fs/projet/projet-donnees-fc+.md @@ -1,8 +1,8 @@ -[Documentation Fournisseur de Service](../README.md) > [Gerer un projet d'integration FranceConnect+](../README.md#je-veux-devenir-fournisseur-de-service) > Données accessible via FranceConnect+ +[Documentation Fournisseur de Service](../README.md) > [Gerer un projet d'integration FranceConnect+](../README.md#je-veux-devenir-fournisseur-de-service) > Quelles sont les données que je peux récupérer par FranceConnect+ sur mes usagers ? --- -# Je veux connaitre les données que je peux récupérer de FranceConnect+ +# Quelles sont les données que je peux récupérer par FranceConnect+ sur mes usagers ? Les données usagers sont fournies par les Fournisseurs d'Identité aux Fournisseurs de Service, via FranceConnect+, conformément à l'habilitation obtenue via [datapass.api.gouv.fr](https://datapass.api.gouv.fr), et le choix des données réalisé par le fournisseur de service dans cette demande. diff --git a/fs/technique/technique-boutons-fc.md b/fs/technique/technique-boutons-fc.md index b8dc71d..2659aa0 100644 --- a/fs/technique/technique-boutons-fc.md +++ b/fs/technique/technique-boutons-fc.md @@ -1,3 +1,7 @@ +[Documentation Fournisseur](../README.md) > [J'intègre FranceConnect+ dans mon service en ligne](../README.md#jintègre-franceconnect-dans-mon-service-en-ligne) > Comment intégrer le bouton FranceConnect+ à mon service ? + +--- + # Comment intégrer le bouton FranceConnect+ à mon service ? En fonction du type de service, il existe deux intégration possible du bouton FranceConnect+ : diff --git a/fs/technique/technique-eidas.md b/fs/technique/technique-eidas.md index a8489da..17e045b 100644 --- a/fs/technique/technique-eidas.md +++ b/fs/technique/technique-eidas.md @@ -1,9 +1,10 @@ +[Documentation Fournisseur](../README.md) > [J'intègre FranceConnect+ dans mon service en ligne](../README.md#jintègre-franceconnect-dans-mon-service-en-ligne) > Comment utiliser les niveaux de garantie eIDAS sur FranceConnect+ ? --- # Comment utiliser les niveaux de garantie eIDAS sur FranceConnect+ ? -## Les niveaux eIDAS disponible sur la plateforme FranceConnect+ +## Les niveaux eIDAS disponible sur la plateforme FranceConnect+ La plaforme FranceConnect+ est qualifié pour fournir des identités de niveau de garantie eIDAS substantiel et élevé. Le niveau de garantie faible n'est pas supporté. Si vous souhaitez obtenir des identités ayant un niveau de garantie faible, vous devez pour cela utiliser la plateforme FranceConnect. diff --git a/fs/technique/technique-env-fc.md b/fs/technique/technique-env-fc.md index d81bac9..3ede20e 100644 --- a/fs/technique/technique-env-fc.md +++ b/fs/technique/technique-env-fc.md @@ -1,4 +1,4 @@ - +[Documentation Fournisseur](../README.md) > [J'intègre FranceConnect+ dans mon service en ligne](../README.md#jintègre-franceconnect-dans-mon-service-en-ligne) > Comment accéder aux différents environnements de FranceConnect+ ? --- diff --git a/fs/technique/technique-oidc-fc.md b/fs/technique/technique-oidc-fc.md index 39ec818..7054143 100644 --- a/fs/technique/technique-oidc-fc.md +++ b/fs/technique/technique-oidc-fc.md @@ -1,4 +1,4 @@ -[Documentation Fournisseur de Service](../README.md) > [J'intègre FranceConnect+ dans mon service en ligne](../README.md#jint%C3%A8gre-franceconnect-dans-mon-service-en-ligne) > Comment FranceConnect+ utilise le protocole OpenId Connect ? +[Documentation Fournisseur](../README.md) > [J'intègre FranceConnect+ dans mon service en ligne](../README.md#jintègre-franceconnect-dans-mon-service-en-ligne) > Comment FranceConnect+ utilise le protocole OpenId Connect ? --- @@ -24,7 +24,7 @@ Le protocole OpenID Connect propose différents *flow* permettant de récupérer ## Discovery Mode -Le protocole OpenId Connect permet à *l'Identity Provider* d'exposer à *Relying Party* de récupérer dynamiquement ses données de configuration (*meta-data*). +Le protocole OpenID Connect permet à *l'Identity Provider* d'exposer à *Relying Party* de récupérer dynamiquement ses données de configuration (*meta-data*). [Plus d'information sur OpenID Connect Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html) diff --git a/fs/technique/technique-oidc-flux.md b/fs/technique/technique-oidc-flux.md index caf109e..8c72a44 100644 --- a/fs/technique/technique-oidc-flux.md +++ b/fs/technique/technique-oidc-flux.md @@ -1,3 +1,4 @@ +[Documentation Fournisseur](../README.md) > [J'intègre FranceConnect+ dans mon service en ligne](../README.md#jintègre-franceconnect-dans-mon-service-en-ligne) > Quels échanges ont lieu entre mon service et FranceConnect+ lors d'une cinématique ? --- diff --git a/fs/technique/technique-oidc.md b/fs/technique/technique-oidc.md index 92dc881..d16339d 100644 --- a/fs/technique/technique-oidc.md +++ b/fs/technique/technique-oidc.md @@ -1,3 +1,7 @@ +[Documentation Fournisseur](../README.md) > [J'intègre FranceConnect+ dans mon service en ligne](../README.md#jintègre-franceconnect-dans-mon-service-en-ligne) > Qu'est ce que le protocole OpenID Connect ? + +--- + # Qu'est ce que le protocole OpenID Connect ? @@ -50,9 +54,9 @@ OAuth 2.0 propose les types d'autorisations suivants: authorization code, implic Il faut noter que le protocole OAuth 2.O ne gère pas l'authentification de l'utilisateur. L'identité de l'utilisateur ne permet pas au client d'accéder au informations d'identités de l'utilisateur. Afin de rajouter ces informations, le protocole Openid Connect étant OAuth 2.0 pour intégrer l'accès aux informations d'identités de l'utilisateur. -## Qu'apporte OpenId Connect à OAuth 2.0 ? +## Qu'apporte OpenID Connect à OAuth 2.0 ? -Le protocole OpenId Connect s'appuie sur OAuth 2.0 en ajoutant des fonctionnalités supplémentaires : +Le protocole OpenID Connect s'appuie sur OAuth 2.0 en ajoutant des fonctionnalités supplémentaires : - La gestion d'information sur l'authentification - l'ajout d'un ID Token @@ -120,4 +124,13 @@ OpenId proposte 3 types de flow qui permettent de récupérer des tokens : - **Implicit flow** : l'appel au endpoint *authorization* permet de récupérer directement les tokens, le refresh token ne peut pas être récupéré. - **Hybrid flow** : Il s'agit d'un mix entre les deux. +--- + +Voir aussi : + +- [Comment FranceConnect+ utilise le protocole OpenId Connect ?](./technique-oidc-fc.md) +- [Quels échanges ont lieu entre mon service et FranceConnect+ lors d'une cinématique ?](./technique-oidc-flux.md) + + + diff --git a/fs/technique/technique-scope-fc.md b/fs/technique/technique-scope-fc.md index f7a8ff9..2196279 100644 --- a/fs/technique/technique-scope-fc.md +++ b/fs/technique/technique-scope-fc.md @@ -1,4 +1,4 @@ - +[Documentation Fournisseur](../README.md) > [J'intègre FranceConnect+ dans mon service en ligne](../README.md#jintègre-franceconnect-dans-mon-service-en-ligne) > Comment utiliser les scopes OpenID Connect pour accéder aux données des utilisateurs ? --- @@ -112,3 +112,11 @@ Le tableau suivant décris la liste des *claims* accessible en fonction des *sco | rnipp_profile | given_name, family_name, birthdate, gender,preferred_username,rnipp_given_name, rnipp_family_name, rnipp_birthdate, rnipp_gender | | rnipp_birth | birthplace, birthcountry, rnipp_birthplace, rnipp_birthcountry | | rnipp_identite_pivot | given_name, family_name, birthdate, gender, birthplace, birthcountry, rnipp_given_name, rnipp_family_name, rnipp_birthdate, rnipp_gender, rnipp_birthplace, rnipp_birthcountry| + +--- + +Voir aussi: + +- [Quelles sont les données que je peux récupérer par FranceConnect+ sur mes usagers ?](../projet/projet-donnees-fc%2B.md) +- [Comment FranceConnect+ utilise le protocole OpenId Connect ?](technique-oidc-fc.md) +- [Qu'est ce que le protocole OpenID Connect ?](technique-oidc.md) \ No newline at end of file From 3b2f69c65ee62c9327f652b335946513d96fe7da Mon Sep 17 00:00:00 2001 From: Benjamin Ratti Date: Fri, 2 Dec 2022 11:10:15 +0100 Subject: [PATCH 22/37] docs(fs) : maj des docs technique --- fs/README.md | 37 ++------------------------- fs/technique/technique-deconnexion.md | 37 +++++++++++++++++++++++++++ fs/technique/technique-erreurs.md | 0 fs/technique/technique-sessions.md | 16 ++++++++++++ 4 files changed, 55 insertions(+), 35 deletions(-) create mode 100644 fs/technique/technique-deconnexion.md create mode 100644 fs/technique/technique-erreurs.md create mode 100644 fs/technique/technique-sessions.md diff --git a/fs/README.md b/fs/README.md index d821be1..8bf46c1 100644 --- a/fs/README.md +++ b/fs/README.md @@ -46,6 +46,8 @@ Vous avez lancé un projet pour devenir FranceConnect+ et vous souhaiter connait - [Comment accéder aux différents environnements de FranceConnect+ ?](technique/technique-env-fc.md) - [Comment utiliser les scopes OpenID Connect pour accéder aux données des utilisateurs ? ](technique/technique-scope-fc.md) - [Comment utiliser les niveaux de garantie eIDAS sur FranceConnect+ ?](technique/technique-eidas.md) +- [Comment déconnecter un utilisateur de FranceConnect+ ?](technique/technique-deconnexion.md) +- [Quelles sont les durées de vie des sessions et jetons de FranceConnect+ ?](technique/technique-sessions.md) ## Je veux connaitre les règles d'intégration du bouton dans mon service @@ -53,48 +55,13 @@ Vous avez lancé un projet pour devenir FranceConnect+ et vous souhaiter connait - [Comment intégrer le bouton FranceConnect+ à mon service ?](technique/technique-boutons-fc.md) -# Je veux déconnecter l'utilisateur de FranceConnect -Pour les niveaux Substantiel et Elevé, FranceConnect+ ne gère pas de session utilisateur et demande systématique à l'utilisateur de se ré-authentifier auprès d'un Founisseur d'Identité. - -Cependant, il est tout de même demandé au Fournisseur de Service de gérer : -* la déconnexion auprès de FranceConnect -* la révocation de l’accès token - -## Cinématique de déconnexion par un Fournisseur de Service - -FranceConnect+ implémente la section sur la déconnexion en cours de spécification dans la norme OpenID Connect : https://openid.net/specs/openid-connect-frontchannel-1_0.html#RPLogout - -FranceConnect+ ne gère pas la déconnexion de l'usager au service FranceConnect+ à la fermeture du navigateur. - -Le Fournisseur de Service doit pouvoir déconnecter l'utilisateur de sa session FranceConnect. La cinématique globale est celle-ci : - -1. L' utilisateur clique sur un lien de déconnexion présenté par le FS. -2. Le FS doit déconnecter l'utilisateur de son application et de sa session FranceConnect. -3. L' utilisateur est redirigé vers la page de retour spécifiée par le FS. -4. Le FS doit préciser l'URL où l'on doit rediriger l'utilisateur une fois qu'il a choisi de se déconnecter ou non de FranceConnect+ via le paramètre post_logout_redirect_uri, ainsi que passer l'id_token récupéré lors de l'authentification de l'utilisateur via le paramètre id_token_hint. - -Il est obligatoire de renseigner les différentes urls de redirections de déconnexion dans les paramètres client - -## Révocation de l'access token - -En tant que Fournisseur de Service, vous avez la possibilité de révoquer un *access token*. Pour cela, FranceConnect+ respecte les spécifications OAuth 2.0 sur lesquelles se base OpenId Connect. La spécification de la révocation de token se trouve à cette adresse https://tools.ietf.org/html/rfc7009 # Gestion d'erreurs entre FranceConnect+ et le Fournisseur de Service En tant qu'OpenID Connect provider, FranceConnect+ peut renvoyer toutes sortes d'erreurs à une application cliente. Pour ce faire, FranceConnect+ passe par le mécanisme de retour d'erreurs d'un fournisseur d'identité openid connect tel que décrit dans la norme ( http://openid.net/specs/openid-connect-core-1_0.html#AuthError, en particulier les sections 3.1.2.6 (authentification), 3.1.3.4 (jeton d'accès), 5.3.3 (service d'informations utilisateur) ) -# Les données de FranceConnect+ qui expirent - -FranceConnect+ gère plusieurs types de données ayant une durée de vie limitée lors du déroulé d'une authentification par OpenID Connect ou de la fourniture d'un jeton d'accès à une ressource protégée (cinématique OAuth2 classique). Chacune de ces données possède une durée de vie qui lui est propre au delà de laquelle elle doit être régénérée. En voici le détail : - -| Type | Utilisé lors de ... | Durée de vie | -| ------ | ------ | ------ | -| Session Web | A chaque authentification et pour maintenir la session côté FranceConnect+ | 30 minutes sans action | -| Access Token | Récupération d'informations (phase 3 cinématique d'authentification / cinématique OAuth2) | 60 secondes | -| Authorization code | Code fourni lors du début de la démarche d'authentification, il sert ensuite à récupérer l'access token | 30 secondes | -| Consentement | Consentement donné par l'utilisateur pour l'accès à une ressource protégée (associée à un scope au sens OAuth2) | 5 secondes | # Glossaire diff --git a/fs/technique/technique-deconnexion.md b/fs/technique/technique-deconnexion.md new file mode 100644 index 0000000..77d9ac1 --- /dev/null +++ b/fs/technique/technique-deconnexion.md @@ -0,0 +1,37 @@ +[Documentation Fournisseur](../README.md) > [J'intègre FranceConnect+ dans mon service en ligne](../README.md#jintègre-franceconnect-dans-mon-service-en-ligne) > Comment déconnecter un utilisateur de FranceConnect+ ? + +--- + +# Comment déconnecter un utilisateur de FranceConnect+ ? + +Pour les niveaux Substantiel et Elevé, FranceConnect+ ne gère pas de session utilisateur et demande systématique à l'utilisateur de se ré-authentifier auprès d'un Founisseur d'Identité. + +Cependant, il est tout de même demandé au Fournisseur de Service de gérer : +* la déconnexion auprès de FranceConnect +* la révocation de l’accès token + +## Cinématique de déconnexion par un Fournisseur de Service + +FranceConnect+ implémente la section sur la déconnexion en cours de spécification dans la norme OpenID Connect : https://openid.net/specs/openid-connect-frontchannel-1_0.html#RPLogout + +FranceConnect+ ne gère pas la déconnexion de l'usager au service FranceConnect+ à la fermeture du navigateur. + +Le Fournisseur de Service doit pouvoir déconnecter l'utilisateur de sa session FranceConnect. La cinématique globale est celle-ci : + +1. L' utilisateur clique sur un lien de déconnexion présenté par le FS. +2. Le FS doit déconnecter l'utilisateur de son application et de sa session FranceConnect. +3. L' utilisateur est redirigé vers la page de retour spécifiée par le FS. +4. Le FS doit préciser l'URL où l'on doit rediriger l'utilisateur une fois qu'il a choisi de se déconnecter ou non de FranceConnect+ via le paramètre post_logout_redirect_uri, ainsi que passer l'id_token récupéré lors de l'authentification de l'utilisateur via le paramètre id_token_hint. + +Il est obligatoire de renseigner les différentes urls de redirections de déconnexion dans les paramètres client + +## Révocation de l'access token + +En tant que Fournisseur de Service, vous avez la possibilité de révoquer un *access token*. Pour cela, FranceConnect+ respecte les spécifications OAuth 2.0 sur lesquelles se base OpenId Connect. La spécification de la révocation de token se trouve à cette adresse https://tools.ietf.org/html/rfc7009 + +--- + +Voir aussi : + +- [Comment FranceConnect+ utilise le protocole OpenId Connect ?](technique-oidc-fc.md) +- [Qu'est ce que le protocole OpenID Connect ?](technique-oidc.md) \ No newline at end of file diff --git a/fs/technique/technique-erreurs.md b/fs/technique/technique-erreurs.md new file mode 100644 index 0000000..e69de29 diff --git a/fs/technique/technique-sessions.md b/fs/technique/technique-sessions.md new file mode 100644 index 0000000..22f0eaf --- /dev/null +++ b/fs/technique/technique-sessions.md @@ -0,0 +1,16 @@ +[Documentation Fournisseur](../README.md) > [J'intègre FranceConnect+ dans mon service en ligne](../README.md#jintègre-franceconnect-dans-mon-service-en-ligne) > Quelles sont les durées de vie des sessions et jetons de FranceConnect+ ? + +--- + +# Quelles sont les durées de vie des sessions et jetons de FranceConnect+ ? + +FranceConnect+ gère plusieurs types de données ayant une durée de vie limitée lors du déroulé d'une authentification par OpenID Connect ou de la fourniture d'un jeton d'accès à une ressource protégée (cinématique OAuth2 classique). Chacune de ces données possède une durée de vie qui lui est propre au delà de laquelle elle doit être régénérée. En voici le détail : + +| Type | Utilisé lors de ... | Durée de vie | +| ------ | ------ | ------ | +| Session Web | A chaque authentification et pour maintenir la session côté FranceConnect+ | 30 minutes sans action | +| Access Token | Récupération d'informations (phase 3 cinématique d'authentification / cinématique OAuth2) | 60 secondes | +| Authorization code | Code fourni lors du début de la démarche d'authentification, il sert ensuite à récupérer l'access token | 30 secondes | +| Consentement | Consentement donné par l'utilisateur pour l'accès à une ressource protégée (associée à un scope au sens OAuth2) | 5 secondes | + +--- \ No newline at end of file From 415bbba3ece322a4137fdd86282dea7d7c22340f Mon Sep 17 00:00:00 2001 From: Benjamin Ratti Date: Mon, 5 Dec 2022 11:47:07 +0100 Subject: [PATCH 23/37] docs(fs) : guideline d'integration du bouton --- fs/images/technique/guidelines-fc+.png | Bin 0 -> 171861 bytes .../techniqiue-guidelines-fc+-position.png | Bin 0 -> 27830 bytes .../technique-guidelines-fc+-dimensions.png | Bin 0 -> 15232 bytes .../technique-guidelines-fc+-lien.png | Bin 0 -> 14183 bytes .../technique-guidelines-fc+-ne-pas-faire.png | Bin 0 -> 23022 bytes .../technique-guidelines-fc+-themes.png | Bin 0 -> 28178 bytes fs/technique/technique-boutons-fc.md | 63 +++++++++++++----- 7 files changed, 48 insertions(+), 15 deletions(-) create mode 100644 fs/images/technique/guidelines-fc+.png create mode 100644 fs/images/technique/techniqiue-guidelines-fc+-position.png create mode 100644 fs/images/technique/technique-guidelines-fc+-dimensions.png create mode 100644 fs/images/technique/technique-guidelines-fc+-lien.png create mode 100644 fs/images/technique/technique-guidelines-fc+-ne-pas-faire.png create mode 100644 fs/images/technique/technique-guidelines-fc+-themes.png diff --git a/fs/images/technique/guidelines-fc+.png b/fs/images/technique/guidelines-fc+.png new file mode 100644 index 0000000000000000000000000000000000000000..b550896a79606360c1472066046433a85778005f GIT binary patch literal 171861 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≧wy2Bh5?UE(^uf_8>SMYb?{4?*(~*t{ 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

U3n8FV`i;f#iW; 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

cJf}3CQoa6>nzPf%zFP9lKeGQO{wFgHF#1 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�+KCrb+$Kd4|BSvBEb-G*VFzUdP^EyzXKdX8l& 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

@{ z=Beo@q&-_@>metD`ROsWS;Jq=+)R6kD<5#%5GC{--SgD@Deie4r_Tv3OUeZkRL|h> zmOW>RZVMIyPOABF*sx=pn76UCUChF+%3Y=c^>W~eR&65Hq;m74?|gQE3xfDs#OFnI^iA-q4*1Li=rJ#Ww#*d6Qx26mf? zK?XACjPK2*{AK=j-{J>y#N%|4bdo@22vKIJuE)i}l8MAO0S5Ab5G5+m7kbR2Da~g& zkM0b$OsX8A{f^jvQMND$KyW=Zde}D!7m=hErj4t3r1dh&v-{Xr12Z(hYpD+gOy@$G z|K(25f!`xAwUPG*jhT_O%NJ1H<5q8U|2E4%6ZoIIpg`F7<&*z5k-^+s^Y7|oVY2V{ sCK`l|NsQkgg8={Sq5glPMQN;=A%REhoLQBa`{J;a6*T0FAn!i^FSf2JrvLx| literal 0 HcmV?d00001 diff --git a/fs/images/technique/technique-guidelines-fc+-ne-pas-faire.png b/fs/images/technique/technique-guidelines-fc+-ne-pas-faire.png new file mode 100644 index 0000000000000000000000000000000000000000..63a470edc76f53e2e965d0c2d6af9c68ddc729e6 GIT binary patch literal 23022 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 Z%=*tp1oor$ZJ?g{ke-eKCLe7T`fpt-bff?P literal 0 HcmV?d00001 diff --git a/fs/images/technique/technique-guidelines-fc+-themes.png b/fs/images/technique/technique-guidelines-fc+-themes.png new file mode 100644 index 0000000000000000000000000000000000000000..ed24ff7bb33d3b3cf4f75a814560be3a91fa2ba2 GIT binary patch literal 28178 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 literal 0 HcmV?d00001 diff --git a/fs/technique/technique-boutons-fc.md b/fs/technique/technique-boutons-fc.md index 2659aa0..0b3246b 100644 --- a/fs/technique/technique-boutons-fc.md +++ b/fs/technique/technique-boutons-fc.md @@ -4,9 +4,11 @@ # Comment intégrer le bouton FranceConnect+ à mon service ? -En fonction du type de service, il existe deux intégration possible du bouton FranceConnect+ : +En fonction du type de service, il existe deux intégration possible du bouton FranceConnect+ : +- intégration en se basant sur le Système de Design de l'Etat; +- intégration ne se basant pas sur le Système de Design de l'Etat. -## Intégration du Systeme de Design de l'Etat +## Intégration du Système de Design de l'Etat Votre service doit utiliser le [systeme de Design de l'Etat](https://www.systeme-de-design.gouv.fr/). Celui-ci intègre directement un bouton FranceConnect+. Vous pouvez consulter directement dans la documentation du composant [Bouton FranceConnect](https://www.systeme-de-design.gouv.fr/elements-d-interface/composants/bouton-franceconnect). @@ -22,19 +24,50 @@ Téléchargements : ## Règles d'intégration du bouton FranceConnect+ -Les règles suivantes doivent être respectées: +Les règles suivantes doivent être respectées. Vous pouvez également les retrouver dans les [Guideline FranceConnect+](../images/technique/guidelines-fc%2B.png) -- le design, les couleurs et le label du bouton FranceConnect+ ne peuvent pas être modifiés, -- le bouton bleu FranceConnect+ est à utiliser en priorité, -- l'état au survol doit être implémenté, -- la taille recommandée pour une utilisation optimale est de 60 pixels de haut par 230 px de large, -- le bouton FranceConnect+ doit être positionné en premier mode d'authentification, -- il doit être présent dans les sections connexion et inscription (si applicable) du site, -- il doit être séparé des autres modes de connexion/d'inscription: +### Couleurs, Design du bouton - Il est important de dissocier visuellement les différents moyens d’authentification : une séparation visible doit être mise en place entre eux. - La mention "OU" doit également y figurer afin de faire comprendre à l'utilisateur qu'il peut choisir entre FranceConnect+ ou un autre mode de connexion/d'inscription. - +Le bouton FranceConnect+ est déclinable pour un affichage sur fond clair ou sombe. Veuillez à utiliser celle adaptée au contraste. + +![theme clair et sombre FranceConnect+](../images/technique/technique-guidelines-fc%2B-themes.png) + +Le design, les couleurs et le label du bouton FranceConnect+ ne peuvent pas être modifiés. L'état au survol doit être implémenté. + +### Dimensions + +La taille recommandée pour une utilisation optimale est de 60 pixels de haut par 245 px de large. Le bouton peut être plus grand, mais l'homothétie doit être respectée. + +![Taille de l'image 60 x 245 pixels](../images/technique/technique-guidelines-fc%2B-dimensions.png) + +### Textes d'accompagnement + +Au dessus du bouton FranceConnect+, il vous sera demandé d'ajouter systématiquement la phrase explicative *FranceConnect+ est la solution proposée par l'État, pour renforcer la sécurité de vos services en ligne les plus sensibles*. + +Sous le bouton FranceConnect+, il vous sera demandé d'ajouter systématiquement un lien avec le texte "Qu'est-ce que FranceConnect+" qui pointera vers le site https://franceconnect.gouv.fr/france-connect-plus. La phrase doit avoir la couleur et le comportement d'un lien et doit être positionné sous le bouton FranceConnect+ avec un écart de 12 pixels. + +![Lien "Qu'est ce que FranceConnect+ sous le bouton FranceConnect+](../images/technique/technique-guidelines-fc%2B-lien.png) + +### Positionnement du bouton FranceConnect+ par rapport aux autres modes d'authentification. + +Le bouton FranceConnect+ **doit être distinct de vos moyens de connexion natifs et en première position si vous êtres un service public**. Il est important de dissocier visuellement les différents moyens d’authentification: +- une séparation visible doit être mise en place entre eux; +- la mention "OU" doit également y figurer afin de faire comprendre à l'utilisateur qu'il peut choisir entre FranceConnect+ ou un autre mode de connexion/d'inscription. + +![Intégration du bouton FranceConnect+ dans la page](../images/technique/techniqiue-guidelines-fc%2B-position.png) + +### Intégration dans votre service. + +Le bouton FranceConnect+ doit être présent dans la section de votre service permettant aux utilisateurs de s'y connecter. + +Si votre service propose à vos utilisateurs de s'inscrire, le bouton FranceConnect+ doit être proposé également sur la page d'inscription. + +### A ne pas faire + +Lors de l'intégration du bouton FranceConnect+, il n'est pas autorisé de : + - déformer le bouton; + - changer sa couleur; + - modifier son label. + + ![](../images/technique/technique-guidelines-fc%2B-ne-pas-faire.png) -- Au dessus du bouton FranceConnect+, il vous sera demandé d'ajouter systématiquement la phrase explicative "FranceConnect+ est la solution proposée par l'État, pour renforcer la sécurité de vos services en ligne les plus sensibles". -- sous le bouton FranceConnect+, il vous sera demandé d'ajouter systématiquement un lien avec le texte "Qu'est-ce que FranceConnect+" qui pointera vers le site https://franceconnect.gouv.fr/france-connect-plus. From 9a1abfc714372e6c1e6c7506dc39d2fef0f31a56 Mon Sep 17 00:00:00 2001 From: Nicolas Legeay Date: Mon, 5 Dec 2022 12:10:35 +0100 Subject: [PATCH 24/37] Add dedicated glossary page --- fs/README.md | 70 ---------------------- fs/technique/technique-glossaire.md | 92 +++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+), 70 deletions(-) create mode 100644 fs/technique/technique-glossaire.md diff --git a/fs/README.md b/fs/README.md index 8bf46c1..68c535a 100644 --- a/fs/README.md +++ b/fs/README.md @@ -60,73 +60,3 @@ Vous avez lancé un projet pour devenir FranceConnect+ et vous souhaiter connait # Gestion d'erreurs entre FranceConnect+ et le Fournisseur de Service En tant qu'OpenID Connect provider, FranceConnect+ peut renvoyer toutes sortes d'erreurs à une application cliente. Pour ce faire, FranceConnect+ passe par le mécanisme de retour d'erreurs d'un fournisseur d'identité openid connect tel que décrit dans la norme ( http://openid.net/specs/openid-connect-core-1_0.html#AuthError, en particulier les sections 3.1.2.6 (authentification), 3.1.3.4 (jeton d'accès), 5.3.3 (service d'informations utilisateur) ) - - - - -# Glossaire - - -* **FC_URL :** URL de FranceConnect+ -* **FS_URL :** Votre URL, en tant que fournisseur de service -* **FD_URL :** URL du fournisseur de données -* **CALLBACK_URL_DATA :** le callback du FS, communiqué lors de son inscription auprès de FC -* **POST_LOGOUT_REDIRECT_URI :** L'URL de redirection après la demande de déconnexion FC -* **CLIENT_ID :** Identifiant du FS, communiqué lors de son inscription auprès de FC -* **CLIENT_SECRET :** Le secret du FS, communiqué lors de son inscription auprès de FC -* **AUTHZ_CODE :** Code retourné (dans l'URL) par FC au FS lorsque ce dernier fait un appel sur le endpoint FC_URL/api/v1/authorize. Il est ensuite passé (dans le corps de la requête HTTP POST) lors de l'appel sur le endpoint FC_URL/api/v1/token -* **ACCESS_TOKEN :** oken retourné (dans le corps HTTP) par l'appel au endpoint FC_URL/api/v2/token. Il est ensuite passé lors de l'appel au endpoint FC_URL/api/v2/userinfo -* **SCOPES :** Liste des scopes demandés séparés par des espaces (donc par %20 au format unicode dans l'URL) - -Voici la liste supportée par FranceConnect+ : - - * openid : obligatoire, permet de demander l'identifiant technique de l'utilisateur au format OpenIDConnect - * profile : obligatoire, permet de récupérer l'essentiel de l'identité pivot. Si disponible, renvoie aussi le preferred_username - * birth : obligatoire, permet de récupérer la ville et le département de naissance de la personne (identité pivot) - * email : obligatoire, permet de récupérer l'adresse électronique de la personne - -Cette liste de scopes est définie par la norme OpenIDConnect - -L'identité pivot complète se récupère soit par le scope identite_pivot, soit en cumulant deux scopes différents (profile + birth) car les informations de ville et de département de naissance de la personne ne font pas partie des données pouvant être renvoyées en soumettant le scope 'profile' seul. Le découpage est fait ici dans un souci de se conformer à la norme. - -* **ID_TOKEN :** Objet JWT retourné par l'appel au endpoint FC_URL/api/21/token. L'objet JWT est un objet JSON formatté et signé. Le JSON doit contenir ces six clés : aud,exp,iat,iss,sub et nonce. - -Exemple de JWT : - -``` -eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2ZjcC5kb2NrZXIuZGV2LWZyYW5jZWNvbm5lY3QuZnIiLCJzdWIiOiI0ZDMyN2RkMWU0MjdkYWY0ZDUwMjk2YWI3MWQ2ZjNmYzgyY2NjNDA3NDI5NDM1MjFkNDJjYjJiYWU0ZGY0MWFmdjEiLCJhdWQiOiJhMGNkNjQzNzJkYjZlY2YzOWMzMTdjMGM3NGNlOTBmMDJkOGFkN2Q1MTBjZTA1NDg4M2I3NTlkNjY2YTk5NmJjIiwiZXhwIjoxNjE5NjA0NTE4LCJpYXQiOjE2MTk2MDQ0NTgsIm5vbmNlIjoiY3VzdG9tTm9uY2UxMSIsImlkcCI6IkZDIiwiYWNyIjoiZWlkYXMxIiwiYW1yIjpudWxsfQ.AdbcnBJluh1UZb4ylEM6oSoarHw-Cb_4--kFWfOJre4 -``` - -Exemple de header du JWT : -```json -{ - "typ": "JWT", - "alg": "HS256" -} -``` - -Exemple de payload du JWT : - -```json -{ - "iss": "https://fcp.docker.dev-franceconnect.fr", - "sub": "4d327dd1e427daf4d50296ab71d6f3fc82ccc40742943521d42cb2bae4df41afv1", - "aud": "a0cd64372db6ecf39c317c0c74ce90f02d8ad7d510ce054883b759d666a996bc", - "exp": 1619604518, - "iat": 1619604458, - "nonce": "customNonce11", - "idp": "FC", - "acr": "eidas1", - "amr": null -} -``` -Les champs *aud, exp, iat, iss, sub* sont des champs obligatoires de la norme OpenId Connect. Le *nonce* est un paramètre obligatoirement envoyé lors de l'appel à `/authorization`. Le FS doit impérativement vérifier que la valeur correspond bien à celle qu'il a envoyée, et qui doit être liée à la session de l'utilisateur. - -Si vous utilisez une librairie pour transformer le json en JWT, il génèrera une chaîne de caractères constitué de 3 chaînes base64 séparées par un point. - - -* **ID_TOKEN_HINT :** Objet JWT identique au format ID_TOKEN qui a été reçu lors de l'échange avec l'appel à FC_URL/api/v1/token et doit être passé en paramètre lors de l'appel à FC_URL/api/v2/logout -* **USER_INFO :** Voir la section identité pivot -* **STATE :** Champ obligatoire, généré aléatoirement par le FS, que FC 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 :** Champ obligatoire, généré aléatoirement par le FS que FC renvoie tel quel dans la réponse à l'appel à /token, pour être ensuite vérifié par le FS. Il est utilisé pour empêcher les attaques par rejeu -* **SUB :** Identifiant technique (unique et stable dans le temps pour un individu donné) fourni par FranceConnect+ au FS. Le SUB est présent dans l'IdToken retourné au FS ainsi que dans les informations d'identité. Le SUB retourné par FranceConnect+ est spécifique à chaque fournisseur de service (i.e: Un usager aura toujours le même SUB pour un Fournisseur de Service donné, en revanche il aura un SUB différent par Fournisseur de Service qu'il utilise). diff --git a/fs/technique/technique-glossaire.md b/fs/technique/technique-glossaire.md new file mode 100644 index 0000000..d0265e5 --- /dev/null +++ b/fs/technique/technique-glossaire.md @@ -0,0 +1,92 @@ +# Glossaire + +#### **FC_URL:** +URL de FranceConnect+ + +#### **FS_URL:** +Votre URL, en tant que fournisseur de service + +#### **FD_URL:** +URL du fournisseur de données + +#### **CALLBACK_URL_DATA:** +le callback du FS, communiqué lors de son inscription auprès de FC +#### **POST_LOGOUT_REDIRECT_URI:** +L'URL de redirection après la demande de déconnexion FC + +#### **CLIENT_ID:** +Identifiant du FS, communiqué lors de son inscription auprès de FC + +#### **CLIENT_SECRET:** +Le secret du FS, communiqué lors de son inscription auprès de FC + +#### **AUTHZ_CODE:** +Code retourné (dans l'URL) par FC au FS lorsque ce dernier fait un appel sur le endpoint FC_URL/api/v1/authorize. Il est ensuite passé (dans le corps de la requête HTTP POST) lors de l'appel sur le endpoint FC_URL/api/v1/token + +#### **ACCESS_TOKEN:** +Token retourné (dans le corps HTTP) par l'appel au endpoint FC_URL/api/v2/token. Il est ensuite passé lors de l'appel au endpoint FC_URL/api/v2/userinfo + +#### **SCOPES:** +Liste des scopes demandés séparés par des espaces (donc par %20 au format unicode dans l'URL) + +Voici la liste supportée par FranceConnect+ : + + * openid : obligatoire, permet de demander l'identifiant technique de l'utilisateur au format OpenIDConnect + * profile : obligatoire, permet de récupérer l'essentiel de l'identité pivot. Si disponible, renvoie aussi le preferred_username + * birth : obligatoire, permet de récupérer la ville et le département de naissance de la personne (identité pivot) + * email : obligatoire, permet de récupérer l'adresse électronique de la personne + +Cette liste de scopes est définie par la norme OpenIDConnect + +L'identité pivot complète se récupère soit par le scope identite_pivot, soit en cumulant deux scopes différents (profile + birth) car les informations de ville et de département de naissance de la personne ne font pas partie des données pouvant être renvoyées en soumettant le scope 'profile' seul. Le découpage est fait ici dans un souci de se conformer à la norme. + +#### **ID_TOKEN:** +Objet JWT retourné par l'appel au endpoint FC_URL/api/21/token. L'objet JWT est un objet JSON formatté et signé. Le JSON doit contenir ces six clés : aud,exp,iat,iss,sub et nonce. + +Exemple de JWT : + +``` +eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2ZjcC5kb2NrZXIuZGV2LWZyYW5jZWNvbm5lY3QuZnIiLCJzdWIiOiI0ZDMyN2RkMWU0MjdkYWY0ZDUwMjk2YWI3MWQ2ZjNmYzgyY2NjNDA3NDI5NDM1MjFkNDJjYjJiYWU0ZGY0MWFmdjEiLCJhdWQiOiJhMGNkNjQzNzJkYjZlY2YzOWMzMTdjMGM3NGNlOTBmMDJkOGFkN2Q1MTBjZTA1NDg4M2I3NTlkNjY2YTk5NmJjIiwiZXhwIjoxNjE5NjA0NTE4LCJpYXQiOjE2MTk2MDQ0NTgsIm5vbmNlIjoiY3VzdG9tTm9uY2UxMSIsImlkcCI6IkZDIiwiYWNyIjoiZWlkYXMxIiwiYW1yIjpudWxsfQ.AdbcnBJluh1UZb4ylEM6oSoarHw-Cb_4--kFWfOJre4 +``` + +Exemple de header du JWT : +```json +{ + "typ": "JWT", + "alg": "HS256" +} +``` + +Exemple de payload du JWT : + +```json +{ + "iss": "https://fcp.docker.dev-franceconnect.fr", + "sub": "4d327dd1e427daf4d50296ab71d6f3fc82ccc40742943521d42cb2bae4df41afv1", + "aud": "a0cd64372db6ecf39c317c0c74ce90f02d8ad7d510ce054883b759d666a996bc", + "exp": 1619604518, + "iat": 1619604458, + "nonce": "customNonce11", + "idp": "FC", + "acr": "eidas1", + "amr": null +} +``` +Les champs *aud, exp, iat, iss, sub* sont des champs obligatoires de la norme OpenId Connect. Le *nonce* est un paramètre obligatoirement envoyé lors de l'appel à `/authorization`. Le FS doit impérativement vérifier que la valeur correspond bien à celle qu'il a envoyée, et qui doit être liée à la session de l'utilisateur. + +Si vous utilisez une librairie pour transformer le json en JWT, il génèrera une chaîne de caractères constitué de 3 chaînes base64 séparées par un point. + +#### **ID_TOKEN_HINT:** +Objet JWT identique au format ID_TOKEN qui a été reçu lors de l'échange avec l'appel à FC_URL/api/v1/token et doit être passé en paramètre lors de l'appel à FC_URL/api/v2/logout + +#### **USER_INFO:** +Voir la section identité pivot + +#### **STATE:** +Champ obligatoire, généré aléatoirement par le FS, que FC 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 :** +Champ obligatoire, généré aléatoirement par le FS que FC renvoie tel quel dans la réponse à l'appel à /token, pour être ensuite vérifié par le FS. Il est utilisé pour empêcher les attaques par rejeu + +#### **SUB:** +Identifiant technique (unique et stable dans le temps pour un individu donné) fourni par FranceConnect+ au FS. Le SUB est présent dans l'IdToken retourné au FS ainsi que dans les informations d'identité. Le SUB retourné par FranceConnect+ est spécifique à chaque fournisseur de service (i.e: Un usager aura toujours le même SUB pour un Fournisseur de Service donné, en revanche il aura un SUB différent par Fournisseur de Service qu'il utilise). From 30544ad0bc59da8e598f4931b672b92ea43326e6 Mon Sep 17 00:00:00 2001 From: Nicolas Legeay Date: Mon, 5 Dec 2022 12:10:49 +0100 Subject: [PATCH 25/37] Add draft endpoints page --- fs/technique/technique-endpoints.md | 383 ++++++++++++++++++++++++++++ 1 file changed, 383 insertions(+) create mode 100644 fs/technique/technique-endpoints.md diff --git a/fs/technique/technique-endpoints.md b/fs/technique/technique-endpoints.md new file mode 100644 index 0000000..208bf2d --- /dev/null +++ b/fs/technique/technique-endpoints.md @@ -0,0 +1,383 @@ +# FranceConnect+ Endpoints + +FranceConnect+ met en oeuvre le protocole OpenID Connect pour permettre à un Fournisseur de Services de déléguer à FranceConnect+ l'identification et l'authentification des agents. + +#### Openid Configuration Endpoints + +

+ GET /api/v2/.well-known/openid-configuration + +##### Description + +Implémente la requête de `Provider Configuration` + +https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfigurationRequest + +##### Paramètres + +> Aucun + +##### Réponses + +> | code http | content-type |réponse | +> |---------------|-----------------------------------|---------------------------------------------------------------------| +> | `200` | `application/json;charset=utf-8` | Document JSON décrivant la configuration de FranceConnect+ | + +##### Exemple d'appel + +> ``` +> GET /api/v2/.well-known/openid-configuration HTTP/1.1 +> Host: auth.integ01.dev-franceconnect.fr +> ``` + +Configuration FranceConnect+ sur l'environnement d'intégration: + +https://auth.integ01.dev-franceconnect.fr/api/v2/.well-known/openid-configuration + +
+ +
+ GET /api/v2/jwks + +##### Description + +Liste les clés de signature utilisées par FranceConnect+ + +##### Paramètres + +> Aucun + +> | code http | content-type |réponse | +> |---------------|-----------------------------------|---------------------------------------------------------------------| +> | `200` | `application/json;charset=utf-8` | Document JSON décrivant les clés de signature de FranceConnect+ | + +##### Exemple d'appel + +> ``` +> GET /api/v2/jwks HTTP/1.1 +> Host: auth.integ01.dev-franceconnect.fr +> ``` + +Clés FranceConnect+ sur l'environnement d'intégration: + +https://auth.integ01.dev-franceconnect.fr/api/v2/jwks + +
+ +#### Authorization Endpoint + +
+ GET /api/v2/authorize + +##### Description + +Implémente le `Authorization Endpoint` de Openid Connect: + +https://openid.net/specs/openid-connect-core-1_0.html#AuthorizationEndpoint + +##### Paramètres + +> | nom | requis/optionnel | type de données | description | +> |--------|-----------|----------------|------------------------------------------------------| +> | `response_type` | requis | string | `code` | +> | `client_id` | requis | string | `` Identifiant du FS, communiqué lors de son inscription auprès de FC+ | +> | `redirect_uri` | requis | string |` %2F` Url de retour vers le FS (encodée), communiquée lors de son inscription auprès de FC+ | +> | `acr_values` | requis | string | `eidas1` FranceConnect+ ne garantie que le niveau faible d'eIDAS | +> | `scope` | requis | string | `` Liste des scopes demandés séparés par des espaces (%20 au format unicode dans l'URL) ou des '+' | +> | `claims` | optionnel | string | `` Objet JSON encodé décrivant les claims demandés ([Voir spécification Openid Connect](https://openid.net/specs/openid-connect-core-1_0.html#ClaimsParameter)) | +> | `state` | requis | string (minimum 32 caractères) | `` Champ obligatoire, généré aléatoirement par le FS, que FC+ 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) | `` Champ obligatoire, généré aléatoirement par le FS que FC 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 | `login` si le FS veut forcer la reauthentification au FI. Par défaut, le FI réutilisera une session existante sans demander une reconnexion. (Single Sign-On côté FI) | + +##### Réponses + +> | code http | content-type |réponse | +> |---------------|-----------------------------------|---------------------------------------------------------------------| +> | `303` (succès) | `text/html;charset=UTF-8` | Redirection vers la page de recherche des FI `/api/v2/interaction/{interactionHash}` où {interactionHash} est un hash lié à la session de l'usager | +> | `303` (erreur) | `text/html;charset=UTF-8` | [Redirection vers le FS après erreur de connexion](#redirection-vers-le-fs-après-erreur-de-connexion) | +> | `400` (mauvais format)| `text/html;charset=UTF-8` | La page d'erreur avec code `Y000400` est affichée en cas de mauvais format | + +##### Exemple d'appel + +> ``` +> GET /api/v2/authorize?response_type=code&prompt=login&acr_values=eidas1& +> scope=openid+uid+given_name+usual_name+email& +> claims=%7B%22id_token%22%3A%7B%22amr%22%3A%7B%22essential%22%3Atrue%7D%7D%7D& +> client_id=6925fb8143c76eded44d32b40c0cb1006065f7f003de52712b78985704f39950& +> redirect_uri=https%3A%2F%2Ffsa1v2.integ01.dev-agentconnect.fr%2Foidc-callback& +> state=9ed67ae42fdc5d0a6867a5425a284745f4f73ce8b6edf76e453487aa1b73cc89& +> nonce=7db9b35458f2288bade947791f1c8fa2d02954f8eb7d9909dc68784f7c4aea29 HTTP/1.1 +> Host: auth.integ01.dev-franceconnect.fr +> ``` + +
+ +
+ POST /api/v2/authorize + +##### Description + +Implémente le `Authorization Endpoint` de Openid Connect: + +https://openid.net/specs/openid-connect-core-1_0.html#AuthorizationEndpoint + +##### Entête + +> | nom | requis/optionnel | valeur | +> |----------------|--------|-------------------------------------| +> | `Content-Type` | requis | `application/x-www-form-urlencoded` | + +##### Body + +> | nom | requis/optionnel | type de données | description | +> |--------|-----------|----------------|------------------------------------------------------| +> | `response_type` | requis | string | `code` | +> | `client_id` | requis | string | `` Identifiant du FS, communiqué lors de son inscription auprès de FC+ | +> | `redirect_uri` | requis | string |`%2F` Url de retour vers le FS (encodée), communiquée lors de son inscription auprès de FC+ | +> | `acr_values` | requis | string | `eidas1` FranceConnect+ ne garantie que le niveau faible d'eIDAS | +> | `scope` | requis | string | `` Liste des scopes demandés séparés par des espaces (%20 au format unicode dans l'URL) ou des '+' | +> | `claims` | optionnel | string | `` Objet JSON encodé décrivant les claims demandés ([Voir spécification Openid Connect](https://openid.net/specs/openid-connect-core-1_0.html#ClaimsParameter)) | +> | `state` | requis | string (minimum 32 caractères) | `` Champ obligatoire, généré aléatoirement par le FS, que FC+ 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) | `` Champ obligatoire, généré aléatoirement par le FS que FC 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 | `login` si le FS veut forcer la reauthentification au FI. Par défaut, le FI réutilisera une session existante sans demander une reconnexion. (Single Sign-On côté FI) | + +##### Réponses + +> | code http | content-type |réponse | +> |---------------|-----------------------------------|---------------------------------------------------------------------| +> | `303` (succès) | `text/html;charset=UTF-8` | Redirection vers la page de recherche des FI `/api/v2/interaction/{interactionHash}` où {interactionHash} est un hash lié à la session de l'usager | +> | `303` (erreur) | `text/html;charset=UTF-8` | [Redirection vers le FS après erreur de connexion](#redirection-vers-le-fs-après-erreur-de-connexion) | +> | `400` (mauvais format)| `text/html;charset=UTF-8` | La page d'erreur avec code `Y000400` est affichée en cas de mauvais format | + +##### Exemple d'appel + +> ``` +> POST /api/v2/authorize HTTP/1.1 +> Host: auth.integ01.dev-franceconnect.fr +> Content-Type: application/x-www-form-urlencoded +> +> response_type=code&prompt=login&acr_values=eidas1& +> scope=openid+uid+given_name+usual_name+email& +> claims=%7B%22id_token%22%3A%7B%22amr%22%3A%7B%22essential%22%3Atrue%7D%7D%7D& +> client_id=6925fb8143c76eded44d32b40c0cb1006065f7f003de52712b78985704f39950& +> redirect_uri=https%3A%2F%2Ffsa1v2.integ01.dev-agentconnect.fr%2Foidc-callback& +> state=9ed67ae42fdc5d0a6867a5425a284745f4f73ce8b6edf76e453487aa1b73cc89& +> nonce=7db9b35458f2288bade947791f1c8fa2d02954f8eb7d9909dc68784f7c4aea29 +> ``` + +
+ +#### Redirection vers le FS après erreur de connexion + +
+ GET <FS_URL>/<URL_CALLBACK> + +##### Description + +Redirection vers le FS après une erreur de connexion. + +FranceConnect+ renvoie le code d'erreur, la description de l'erreur et le state. + +##### Paramètres + +> | nom | requis/optionnel | type de données | description | +> |--------|-----------|----------------|------------------------------------------------------| +> | `error` | requis | string | code d'erreur | +> | `error_description` | requis | string | description de l'erreur | +> | `state` | requis | string (minimum 32 caractères) | `` 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 | + +##### Exemple d'appel + +Exemple de retour vers le FS de mock + +> ``` +> GET /oidc-callback?state=9ed67ae42fdc5d0a6867a5425a284745f4f73ce8b6edf76e453487aa1b73cc89 +> error_description=User+auth+aborted&error=access_denied HTTP/1.1 +> Host: fsa1v2.integ01.dev-agentconnect.fr +> ``` + +
+ + +#### Redirection vers le FS après connexion + +
+ GET <FS_URL>/<URL_CALLBACK> + +##### Description + +Redirection vers le FS après connexion chez le FI. + +FranceConnect+ renvoie le code d'autorisation et le state. + +##### 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) | `` 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 | + +##### Exemple d'appel + +Exemple de retour vers le FS de mock + +> ``` +> GET /oidc-callback?code=_DOF10msXreojwyScrXmfqvwp8q3p1G7ZIzatMj60it& +> state=9ed67ae42fdc5d0a6867a5425a284745f4f73ce8b6edf76e453487aa1b73cc89 HTTP/1.1 +> Host: fsa1v2.integ01.dev-agentconnect.fr +> ``` + +
+ +#### Token Endpoint + +
+ POST /api/v2/token + +##### Description + +Implémente le `Token Endpoint` de Openid Connect: + +https://openid.net/specs/openid-connect-core-1_0.html#TokenEndpoint + +##### Entête + +> | nom | requis/optionnel | valeur | +> |----------------|--------|-------------------------------------| +> | `Content-Type` | requis | `application/x-www-form-urlencoded` | + +##### Body + +> | nom | requis/optionnel | type de données | description | +> |--------|-----------|----------------|------------------------------------------------------| +> | `grant_type` | requis | string | `authorization_code` | +> | `client_id` | requis | string | `` Identifiant du FS, communiqué lors de son inscription auprès de FC+ | +> | `client_secret` | requis | string | `` Le secret du FS, communiqué lors de son inscription auprès de FC+ | +> | `redirect_uri` | requis | string |` %2F` Url de retour vers le FS (encodée), communiqué lors de l'appel au `Authorization Endpoint` | +> | `code` | requis | string | `` code d'autorisation fourni par FranceConnect+ après connexion | + +##### 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 | + +##### Format de la réponse en succès + +``` +{ + 'access_token': , + 'token_type': 'Bearer', + 'expires_in': 60, + 'id_token': +} +``` + +Voir le format de l'[id_token](../doc_fs.md#id_token). + +
+ +#### UserInfo Endpoint + +
+ GET /api/v2/userinfo + +##### Description + +Implémente le `UserInfo Endpoint` de Openid Connect: + +https://openid.net/specs/openid-connect-core-1_0.html#UserInfo + +##### Entête + +> | nom | requis/optionnel | valeur | +> |----------------|--------|-------------------------------------| +> | `Authorization` | requis | `Bearer ` où `` a été communiqué par le `Token Endpoint` | + +##### Paramètres + +> Aucun + +##### Réponses + +> | code http | content-type |réponse | +> |---------------|-----------------------------------|---------------------------------------------------------------------| +> | `200` | `application/jwt` | JSON Web Token contenant les claims transmis par le FI | +> | `400` | `application/json;charset=utf-8` | JSON document décrivant l'origine de l'erreur de format | + +Voir le format de [userinfo](../doc_fs.md#userinfo). + +
+ +#### Logout Endpoint + +
+ GET /api/v2/session/end + +##### Description + +Implémente le `Logout Endpoint` de Openid Connect: + +http://openid.net/specs/openid-connect-session-1_0.html#RPLogout + +:warning: Cet appel doit être réalisé via une redirection dans le navigateur de l'agent, afin d'expirer les cookies de session FranceConnect+ et FI. + +##### Paramètres + +> | nom | requis/optionnel | type de données | description | +> |--------|-----------|----------------|------------------------------------------------------| +> | `id_token_hint` | requis | string | `` contenu dans la réponse du `Token Endpoint` | +> | `state` | requis | string | `` Champ obligatoire, généré aléatoirement par le FS, que FC+ 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 | `` L'URL de redirection vers le FS après la déconnexion à FranceConnect+ | + +##### 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](#redirection-vers-le-fs-après-déconnexion) | + +##### 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: auth.integ01.dev-franceconnect.fr +> ``` + +
+ +#### Redirection vers le FS après déconnexion + +
+ GET <FS_URL>/<POST_LOGOUT_REDIRECT_URI> + +##### Description + +Redirection vers le FS après déconnexion. + +FranceConnect+ renvoie le state communiqué par le FS lors de la demande de déconnexion. + +##### Paramètres + +> | nom | requis/optionnel | type de données | description | +> |--------|-----------|----------------|------------------------------------------------------| +> | `state` | requis | string (minimum 32 caractères) | `` 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 | | + +##### 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.fr +> ``` + +
\ No newline at end of file From 02383281ba61089ce54393226e7e603f6d9f6358 Mon Sep 17 00:00:00 2001 From: Benjamin Ratti Date: Mon, 5 Dec 2022 13:58:52 +0100 Subject: [PATCH 26/37] docs(fs) : corrections sur l'integration du bouton --- fs/technique/technique-boutons-fc.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/fs/technique/technique-boutons-fc.md b/fs/technique/technique-boutons-fc.md index 0b3246b..5e63506 100644 --- a/fs/technique/technique-boutons-fc.md +++ b/fs/technique/technique-boutons-fc.md @@ -4,31 +4,31 @@ # Comment intégrer le bouton FranceConnect+ à mon service ? -En fonction du type de service, il existe deux intégration possible du bouton FranceConnect+ : -- intégration en se basant sur le Système de Design de l'Etat; -- intégration ne se basant pas sur le Système de Design de l'Etat. +En fonction du type de service, il existe deux intégrations possibles du bouton FranceConnect+ : +- intégration en se basant sur le Système de Design de l'État; +- intégration ne se basant pas sur le Système de Design de l'État. -## Intégration du Système de Design de l'Etat +## Intégration du Système de Design de l'État -Votre service doit utiliser le [systeme de Design de l'Etat](https://www.systeme-de-design.gouv.fr/). Celui-ci intègre directement un bouton FranceConnect+. Vous pouvez consulter directement dans la documentation du composant [Bouton FranceConnect](https://www.systeme-de-design.gouv.fr/elements-d-interface/composants/bouton-franceconnect). +Votre service doit utiliser le [systeme de Design de l'État](https://www.systeme-de-design.gouv.fr/). Celui-ci intègre directement un bouton FranceConnect+. Vous pouvez consulter directement dans la documentation du composant [Bouton FranceConnect](https://www.systeme-de-design.gouv.fr/elements-d-interface/composants/bouton-franceconnect). -## Intégration hors du systeme de Design de l'Etat -Les boutons d’action FranceConnect+ sont primordiaux dans l’usage du service. Il est obligatoire d’utiliser l’un des boutons proposé et aucun autre visuel pour la connexion des usagers. +## Intégration hors du systeme de Design de l'Etat -Pour les boutons en svg, lors de l'utilisation d'une image veuillez préciser la taille du bouton. +Les boutons d’action FranceConnect+ sont primordiaux dans l’usage du service. Il est obligatoire d’utiliser l’un des boutons proposés et aucun autre visuel pour la connexion des usagers. Téléchargements : * [FranceConnect-Plus-Boutons.zip](FranceConnect-Plus-Boutons.zip) + ## Règles d'intégration du bouton FranceConnect+ Les règles suivantes doivent être respectées. Vous pouvez également les retrouver dans les [Guideline FranceConnect+](../images/technique/guidelines-fc%2B.png) ### Couleurs, Design du bouton -Le bouton FranceConnect+ est déclinable pour un affichage sur fond clair ou sombe. Veuillez à utiliser celle adaptée au contraste. +Le bouton FranceConnect+ est déclinable pour un affichage sur fond clair ou sombre. Veillez à utiliser celle adaptée au contraste. ![theme clair et sombre FranceConnect+](../images/technique/technique-guidelines-fc%2B-themes.png) @@ -44,14 +44,14 @@ La taille recommandée pour une utilisation optimale est de 60 pixels de haut pa Au dessus du bouton FranceConnect+, il vous sera demandé d'ajouter systématiquement la phrase explicative *FranceConnect+ est la solution proposée par l'État, pour renforcer la sécurité de vos services en ligne les plus sensibles*. -Sous le bouton FranceConnect+, il vous sera demandé d'ajouter systématiquement un lien avec le texte "Qu'est-ce que FranceConnect+" qui pointera vers le site https://franceconnect.gouv.fr/france-connect-plus. La phrase doit avoir la couleur et le comportement d'un lien et doit être positionné sous le bouton FranceConnect+ avec un écart de 12 pixels. +Sous le bouton FranceConnect+, il vous sera demandé d'ajouter systématiquement un lien avec le texte "Qu'est-ce que FranceConnect+" qui pointera vers le site https://franceconnect.gouv.fr/france-connect-plus. La phrase doit avoir la couleur et le comportement d'un lien et doit être positionnée sous le bouton FranceConnect+ avec un écart de 12 pixels. ![Lien "Qu'est ce que FranceConnect+ sous le bouton FranceConnect+](../images/technique/technique-guidelines-fc%2B-lien.png) ### Positionnement du bouton FranceConnect+ par rapport aux autres modes d'authentification. -Le bouton FranceConnect+ **doit être distinct de vos moyens de connexion natifs et en première position si vous êtres un service public**. Il est important de dissocier visuellement les différents moyens d’authentification: -- une séparation visible doit être mise en place entre eux; +Le bouton FranceConnect+ **doit être distinct de vos moyens de connexion natifs et en première position si vous êtres un service public**. Il est important de dissocier visuellement les différents moyens d’authentification : +- une séparation visible doit être mise en place entre eux ; - la mention "OU" doit également y figurer afin de faire comprendre à l'utilisateur qu'il peut choisir entre FranceConnect+ ou un autre mode de connexion/d'inscription. ![Intégration du bouton FranceConnect+ dans la page](../images/technique/techniqiue-guidelines-fc%2B-position.png) @@ -62,7 +62,7 @@ Le bouton FranceConnect+ doit être présent dans la section de votre service pe Si votre service propose à vos utilisateurs de s'inscrire, le bouton FranceConnect+ doit être proposé également sur la page d'inscription. -### A ne pas faire +### À ne pas faire Lors de l'intégration du bouton FranceConnect+, il n'est pas autorisé de : - déformer le bouton; From 17e3ce4ba2b627781893ceb969503c9d3f2cb5ad Mon Sep 17 00:00:00 2001 From: Nicolas Legeay Date: Mon, 5 Dec 2022 15:23:32 +0100 Subject: [PATCH 27/37] Fix FC+ endpoint documentation --- fs/technique/technique-endpoints.md | 34 ++++++++++++++--------------- fs/technique/technique-glossaire.md | 8 +++---- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/fs/technique/technique-endpoints.md b/fs/technique/technique-endpoints.md index 208bf2d..292c1a3 100644 --- a/fs/technique/technique-endpoints.md +++ b/fs/technique/technique-endpoints.md @@ -1,6 +1,6 @@ # FranceConnect+ Endpoints -FranceConnect+ met en oeuvre le protocole OpenID Connect pour permettre à un Fournisseur de Services de déléguer à FranceConnect+ l'identification et l'authentification des agents. +FranceConnect+ met en oeuvre le protocole OpenID Connect pour permettre à un Fournisseur de Services de déléguer à FranceConnect+ l'identification et l'authentification des usagers. #### Openid Configuration Endpoints @@ -82,29 +82,29 @@ https://openid.net/specs/openid-connect-core-1_0.html#AuthorizationEndpoint > | `response_type` | requis | string | `code` | > | `client_id` | requis | string | `` Identifiant du FS, communiqué lors de son inscription auprès de FC+ | > | `redirect_uri` | requis | string |` %2F` Url de retour vers le FS (encodée), communiquée lors de son inscription auprès de FC+ | -> | `acr_values` | requis | string | `eidas1` FranceConnect+ ne garantie que le niveau faible d'eIDAS | +> | `acr_values` | requis | string | `eidas2 | eidas3` FranceConnect+ supporte les niveaux eIDAS substantiel et élevé | > | `scope` | requis | string | `` Liste des scopes demandés séparés par des espaces (%20 au format unicode dans l'URL) ou des '+' | > | `claims` | optionnel | string | `` Objet JSON encodé décrivant les claims demandés ([Voir spécification Openid Connect](https://openid.net/specs/openid-connect-core-1_0.html#ClaimsParameter)) | > | `state` | requis | string (minimum 32 caractères) | `` Champ obligatoire, généré aléatoirement par le FS, que FC+ 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) | `` Champ obligatoire, généré aléatoirement par le FS que FC 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 | `login` si le FS veut forcer la reauthentification au FI. Par défaut, le FI réutilisera une session existante sans demander une reconnexion. (Single Sign-On côté FI) | +> | `prompt` | optionnel | string | `login` FC+ force une demande de réauthentification avec le FI à chaque connexion | ##### Réponses > | code http | content-type |réponse | > |---------------|-----------------------------------|---------------------------------------------------------------------| -> | `303` (succès) | `text/html;charset=UTF-8` | Redirection vers la page de recherche des FI `/api/v2/interaction/{interactionHash}` où {interactionHash} est un hash lié à la session de l'usager | +> | `303` (succès) | `text/html;charset=UTF-8` | Redirection vers la page de sélection du FI `/api/v2/interaction/{interactionHash}` où {interactionHash} est un hash lié à la session de l'usager | > | `303` (erreur) | `text/html;charset=UTF-8` | [Redirection vers le FS après erreur de connexion](#redirection-vers-le-fs-après-erreur-de-connexion) | > | `400` (mauvais format)| `text/html;charset=UTF-8` | La page d'erreur avec code `Y000400` est affichée en cas de mauvais format | ##### Exemple d'appel > ``` -> GET /api/v2/authorize?response_type=code&prompt=login&acr_values=eidas1& -> scope=openid+uid+given_name+usual_name+email& +> GET /api/v2/authorize?response_type=code&prompt=login&acr_values=eidas2& +> scope=openid+gender+given_name+family_name+email+preferred_username& > claims=%7B%22id_token%22%3A%7B%22amr%22%3A%7B%22essential%22%3Atrue%7D%7D%7D& > client_id=6925fb8143c76eded44d32b40c0cb1006065f7f003de52712b78985704f39950& -> redirect_uri=https%3A%2F%2Ffsa1v2.integ01.dev-agentconnect.fr%2Foidc-callback& +> redirect_uri=https%3A%2F%2Ffsp1v2.integ01.fcp.fournisseur-de-service.fr%2Foidc-callback& > state=9ed67ae42fdc5d0a6867a5425a284745f4f73ce8b6edf76e453487aa1b73cc89& > nonce=7db9b35458f2288bade947791f1c8fa2d02954f8eb7d9909dc68784f7c4aea29 HTTP/1.1 > Host: auth.integ01.dev-franceconnect.fr @@ -134,12 +134,12 @@ https://openid.net/specs/openid-connect-core-1_0.html#AuthorizationEndpoint > | `response_type` | requis | string | `code` | > | `client_id` | requis | string | `` Identifiant du FS, communiqué lors de son inscription auprès de FC+ | > | `redirect_uri` | requis | string |`%2F` Url de retour vers le FS (encodée), communiquée lors de son inscription auprès de FC+ | -> | `acr_values` | requis | string | `eidas1` FranceConnect+ ne garantie que le niveau faible d'eIDAS | +> | `acr_values` | requis | string | `eidas2 | eidas3` FranceConnect+ supporte les niveaux eIDAS substantiel et élevé | > | `scope` | requis | string | `` Liste des scopes demandés séparés par des espaces (%20 au format unicode dans l'URL) ou des '+' | > | `claims` | optionnel | string | `` Objet JSON encodé décrivant les claims demandés ([Voir spécification Openid Connect](https://openid.net/specs/openid-connect-core-1_0.html#ClaimsParameter)) | > | `state` | requis | string (minimum 32 caractères) | `` Champ obligatoire, généré aléatoirement par le FS, que FC+ 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) | `` Champ obligatoire, généré aléatoirement par le FS que FC 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 | `login` si le FS veut forcer la reauthentification au FI. Par défaut, le FI réutilisera une session existante sans demander une reconnexion. (Single Sign-On côté FI) | +> | `prompt` | optionnel | string | `login` FC+ force une demande de réauthentification avec le FI à chaque connexion | ##### Réponses @@ -156,11 +156,11 @@ https://openid.net/specs/openid-connect-core-1_0.html#AuthorizationEndpoint > Host: auth.integ01.dev-franceconnect.fr > Content-Type: application/x-www-form-urlencoded > -> response_type=code&prompt=login&acr_values=eidas1& -> scope=openid+uid+given_name+usual_name+email& +> response_type=code&prompt=login&acr_values=eidas2& +> scope=openid+gender+given_name+family_name+email+preferred_username& > claims=%7B%22id_token%22%3A%7B%22amr%22%3A%7B%22essential%22%3Atrue%7D%7D%7D& > client_id=6925fb8143c76eded44d32b40c0cb1006065f7f003de52712b78985704f39950& -> redirect_uri=https%3A%2F%2Ffsa1v2.integ01.dev-agentconnect.fr%2Foidc-callback& +> redirect_uri=https%3A%2F%2Ffsp1v2.integ01.fcp.fournisseur-de-service.fr%2Foidc-callback& > state=9ed67ae42fdc5d0a6867a5425a284745f4f73ce8b6edf76e453487aa1b73cc89& > nonce=7db9b35458f2288bade947791f1c8fa2d02954f8eb7d9909dc68784f7c4aea29 > ``` @@ -193,7 +193,7 @@ Exemple de retour vers le FS de mock > ``` > GET /oidc-callback?state=9ed67ae42fdc5d0a6867a5425a284745f4f73ce8b6edf76e453487aa1b73cc89 > error_description=User+auth+aborted&error=access_denied HTTP/1.1 -> Host: fsa1v2.integ01.dev-agentconnect.fr +> Host: fsp1v2.integ01.fcp.fournisseur-de-service.fr > ``` @@ -224,7 +224,7 @@ Exemple de retour vers le FS de mock > ``` > GET /oidc-callback?code=_DOF10msXreojwyScrXmfqvwp8q3p1G7ZIzatMj60it& > state=9ed67ae42fdc5d0a6867a5425a284745f4f73ce8b6edf76e453487aa1b73cc89 HTTP/1.1 -> Host: fsa1v2.integ01.dev-agentconnect.fr +> Host: fsp1v2.integ01.fcp.fournisseur-de-service.fr > ``` @@ -321,7 +321,7 @@ Implémente le `Logout Endpoint` de Openid Connect: http://openid.net/specs/openid-connect-session-1_0.html#RPLogout -:warning: Cet appel doit être réalisé via une redirection dans le navigateur de l'agent, afin d'expirer les cookies de session FranceConnect+ et FI. +:warning: Cet appel doit être réalisé via une redirection dans le navigateur de l'usager, afin d'expirer les cookies de session FranceConnect+ et FI. ##### Paramètres @@ -369,7 +369,7 @@ FranceConnect+ renvoie le state communiqué par le FS lors de la demande de déc > | nom | requis/optionnel | type de données | description | > |--------|-----------|----------------|------------------------------------------------------| -> | `state` | requis | string (minimum 32 caractères) | `` 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 | | +> | `state` | requis | string (minimum 32 caractères) | `` 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 | ##### Exemple d'appel @@ -377,7 +377,7 @@ Exemple de retour vers le FS de mock à déconnexion > ``` > GET /logout-callback?state=3b7bd7fb38ccab89864563f17a89c4cb3bd400164ce828b4cfc2cb01ce8ed9da HTTP/1.1 -> Host: fsa1v2.integ01.dev-agentconnect.fr +> Host: fsp1v2.integ01.fcp.fournisseur-de-service.fr > ``` \ No newline at end of file diff --git a/fs/technique/technique-glossaire.md b/fs/technique/technique-glossaire.md index d0265e5..bcb68f8 100644 --- a/fs/technique/technique-glossaire.md +++ b/fs/technique/technique-glossaire.md @@ -41,7 +41,7 @@ Cette liste de scopes est définie par la norme OpenIDConnect L'identité pivot complète se récupère soit par le scope identite_pivot, soit en cumulant deux scopes différents (profile + birth) car les informations de ville et de département de naissance de la personne ne font pas partie des données pouvant être renvoyées en soumettant le scope 'profile' seul. Le découpage est fait ici dans un souci de se conformer à la norme. #### **ID_TOKEN:** -Objet JWT retourné par l'appel au endpoint FC_URL/api/21/token. L'objet JWT est un objet JSON formatté et signé. Le JSON doit contenir ces six clés : aud,exp,iat,iss,sub et nonce. +Objet JWT retourné par l'appel au endpoint FC_URL/api/v2/token. L'objet JWT est un objet JSON formatté et signé. Le JSON doit contenir ces six clés : aud,exp,iat,iss,sub et nonce. Exemple de JWT : @@ -68,16 +68,16 @@ Exemple de payload du JWT : "iat": 1619604458, "nonce": "customNonce11", "idp": "FC", - "acr": "eidas1", + "acr": "eidas2", "amr": null } ``` -Les champs *aud, exp, iat, iss, sub* sont des champs obligatoires de la norme OpenId Connect. Le *nonce* est un paramètre obligatoirement envoyé lors de l'appel à `/authorization`. Le FS doit impérativement vérifier que la valeur correspond bien à celle qu'il a envoyée, et qui doit être liée à la session de l'utilisateur. +Les champs *aud, exp, iat, iss, sub* sont des champs obligatoires de la norme OpenId Connect. Le *nonce* est un paramètre obligatoirement envoyé lors de l'appel à `/api/v2/authorize`. Le FS doit impérativement vérifier que la valeur correspond bien à celle qu'il a envoyée, et qui doit être liée à la session de l'utilisateur. Si vous utilisez une librairie pour transformer le json en JWT, il génèrera une chaîne de caractères constitué de 3 chaînes base64 séparées par un point. #### **ID_TOKEN_HINT:** -Objet JWT identique au format ID_TOKEN qui a été reçu lors de l'échange avec l'appel à FC_URL/api/v1/token et doit être passé en paramètre lors de l'appel à FC_URL/api/v2/logout +Objet JWT identique au format ID_TOKEN qui a été reçu lors de l'échange avec l'appel à FC_URL/api/v1/token et doit être passé en paramètre lors de l'appel à FC_URL/api/v2/session/end #### **USER_INFO:** Voir la section identité pivot From f5d26bb5673286bbe13ef457a6fb4f1db631b094 Mon Sep 17 00:00:00 2001 From: Nicolas Legeay Date: Mon, 5 Dec 2022 17:17:20 +0100 Subject: [PATCH 28/37] Modify id_token_hint description --- fs/technique/technique-endpoints.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/technique/technique-endpoints.md b/fs/technique/technique-endpoints.md index 292c1a3..c22d663 100644 --- a/fs/technique/technique-endpoints.md +++ b/fs/technique/technique-endpoints.md @@ -327,7 +327,7 @@ http://openid.net/specs/openid-connect-session-1_0.html#RPLogout > | nom | requis/optionnel | type de données | description | > |--------|-----------|----------------|------------------------------------------------------| -> | `id_token_hint` | requis | string | `` contenu dans la réponse du `Token Endpoint` | +> | `id_token_hint` | requis | string | JWT renvoyé par le endpoint `Token Endpoint` | > | `state` | requis | string | `` Champ obligatoire, généré aléatoirement par le FS, que FC+ 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 | `` L'URL de redirection vers le FS après la déconnexion à FranceConnect+ | From cae0f5d9bd98d87174fae3f30ef81f8747c3a6a3 Mon Sep 17 00:00:00 2001 From: Benjamin Ratti Date: Wed, 7 Dec 2022 11:42:10 +0100 Subject: [PATCH 29/37] docs(fs) : maj header --- fs/README.md | 5 +-- ... => technique-guidelines-fc+-position.png} | Bin fs/pilotage/piloge-fi.md | 3 +- fs/pilotage/pilotage-demarches-acteurs.md | 10 ++++-- fs/pilotage/pilotage-differences-fc-fc+.md | 8 ++++- fs/pilotage/pilotage-etapes.md | 19 ++++------- fs/pilotage/pilotage-integrer-fc+-apres-fc.md | 12 +++++-- fs/projet/projet-datapass.md | 2 +- fs/projet/projet-donnees-fc+.md | 2 +- fs/projet/projet-niveau-eidas.md | 2 +- fs/projet/projet-tests-sans-datapass.md | 1 + fs/technique/technique-boutons-fc.md | 4 +-- fs/technique/technique-deconnexion.md | 2 +- fs/technique/technique-eidas.md | 2 +- fs/technique/technique-endpoints.md | 30 ++++++++++++------ fs/technique/technique-env-fc.md | 26 ++++++++------- fs/technique/technique-erreurs.md | 15 +++++++++ fs/technique/technique-glossaire.md | 14 +++++--- fs/technique/technique-oidc-fc.md | 4 +-- fs/technique/technique-oidc-flux.md | 3 +- 20 files changed, 108 insertions(+), 56 deletions(-) rename fs/images/technique/{techniqiue-guidelines-fc+-position.png => technique-guidelines-fc+-position.png} (100%) diff --git a/fs/README.md b/fs/README.md index 68c535a..7d7d884 100644 --- a/fs/README.md +++ b/fs/README.md @@ -48,15 +48,16 @@ Vous avez lancé un projet pour devenir FranceConnect+ et vous souhaiter connait - [Comment utiliser les niveaux de garantie eIDAS sur FranceConnect+ ?](technique/technique-eidas.md) - [Comment déconnecter un utilisateur de FranceConnect+ ?](technique/technique-deconnexion.md) - [Quelles sont les durées de vie des sessions et jetons de FranceConnect+ ?](technique/technique-sessions.md) + - [Comment gérer les erreurs renvoyées par FranceConnect+ ?](technique/technique-erreurs.md) ## Je veux connaitre les règles d'intégration du bouton dans mon service - [Comment intégrer le bouton FranceConnect+ à mon service ?](technique/technique-boutons-fc.md) +## Glossaire +Vous êtes perdu dans l'ensemble des termes techniques présents dans cette documentation ? Nous avons notre [glossaire](technique/technique-glossaire.md) qui est là pour vous aider. -# Gestion d'erreurs entre FranceConnect+ et le Fournisseur de Service -En tant qu'OpenID Connect provider, FranceConnect+ peut renvoyer toutes sortes d'erreurs à une application cliente. Pour ce faire, FranceConnect+ passe par le mécanisme de retour d'erreurs d'un fournisseur d'identité openid connect tel que décrit dans la norme ( http://openid.net/specs/openid-connect-core-1_0.html#AuthError, en particulier les sections 3.1.2.6 (authentification), 3.1.3.4 (jeton d'accès), 5.3.3 (service d'informations utilisateur) ) diff --git a/fs/images/technique/techniqiue-guidelines-fc+-position.png b/fs/images/technique/technique-guidelines-fc+-position.png similarity index 100% rename from fs/images/technique/techniqiue-guidelines-fc+-position.png rename to fs/images/technique/technique-guidelines-fc+-position.png diff --git a/fs/pilotage/piloge-fi.md b/fs/pilotage/piloge-fi.md index 0a10ad3..955d0a5 100644 --- a/fs/pilotage/piloge-fi.md +++ b/fs/pilotage/piloge-fi.md @@ -1,3 +1,4 @@ +[Documentation Fournisseur](../README.md) > [Je veux devenir Fournisseur de Service](../README.md#je-veux-devenir-fournisseur-de-service) > Quels sont les fournisseurs d'identités disponible sur FranceConnect+ ? --- @@ -12,4 +13,4 @@ En complément des fournisseurs d'identité, FranceConnect+ propose également u Voir aussi : -- [Qu'est ce qu'eIDAS et quels sont les niveaux de garantie de FranceConnect+ ?](../projet/projet-niveau-eidas.md) \ No newline at end of file +- [Qu'est ce qu'eIDAS et quels sont les niveaux de garantie de FranceConnect+ ?](../projet/projet-niveau-eidas.md) diff --git a/fs/pilotage/pilotage-demarches-acteurs.md b/fs/pilotage/pilotage-demarches-acteurs.md index fa44d4e..fa11690 100644 --- a/fs/pilotage/pilotage-demarches-acteurs.md +++ b/fs/pilotage/pilotage-demarches-acteurs.md @@ -1,4 +1,4 @@ -[Documentation Fournisseur de Service](README.md) > [Devenir Fournisseur de Service FranceConnect+](../../README.md#je-veux-devenir-fournisseur-de-service) > Acteurs à impliquer +[Documentation Fournisseur](../README.md) > [Je veux devenir Fournisseur de Service](../README.md#je-veux-devenir-fournisseur-de-service) > Quels sont les acteurs à impliquer dans l'intégration de FranceConnect+ ? --- @@ -37,4 +37,10 @@ ou décline, selon la taille de l’organisation, la politique de sécurité des systèmes d’information (prévention, protection, détection, résilience, remédiation) et veille à son application. Il assure un rôle de conseil, d’assistance, d’information, de formation et d’alerte, en particulier -auprès des directeurs métiers et/ou de la direction de son périmètre. \ No newline at end of file +auprès des directeurs métiers et/ou de la direction de son périmètre. + +--- + +Voir aussi : + +* [Quelles sont les étapes pour devenir Fournisseur de Service ? ](pilotage-etapes.md) \ No newline at end of file diff --git a/fs/pilotage/pilotage-differences-fc-fc+.md b/fs/pilotage/pilotage-differences-fc-fc+.md index ad84de0..f434832 100644 --- a/fs/pilotage/pilotage-differences-fc-fc+.md +++ b/fs/pilotage/pilotage-differences-fc-fc+.md @@ -1,4 +1,4 @@ -[Documentation Fournisseur de Service](README.md) > [Devenir Fournisseur de Service FranceConnect+](../../README.md#je-veux-devenir-fournisseur-de-service) > Différences entre FranceConnect et FranceConnect+ +[Documentation Fournisseur](../README.md) > [Je veux devenir Fournisseur de Service](../README.md#je-veux-devenir-fournisseur-de-service) > Quelles sont les différences entre FranceConnect et FranceConnect+ ? --- @@ -16,3 +16,9 @@ La principale différences entre FranceConnect et FranceConnect+ est le niveau d La plateforme FranceConnect supporte uniquement le niveau de garantie faible. C'est la plateforme FranceConnect+ qui assurent les niveaux de garantie supérieur, c'est à dire les niveaux de garantie Substantiel et Élevé. --- + +Voir aussi : + +* [Qu'est ce qu'eIDAS et quels sont les niveaux de garantie de FranceConnect+ ?](../projet/projet-niveau-eidas.md) +* [Comment effectuer ma demande d'habilitation pour FranceConnect+ ?](../projet/projet-datapass.md) + diff --git a/fs/pilotage/pilotage-etapes.md b/fs/pilotage/pilotage-etapes.md index 64a393d..7a8fa0d 100644 --- a/fs/pilotage/pilotage-etapes.md +++ b/fs/pilotage/pilotage-etapes.md @@ -1,26 +1,21 @@ -[Documentation Fournisseur de Service](../README.md) > [Devenir Fournisseur de Service FranceConnect+](../../README.md#je-veux-devenir-fournisseur-de-service) > Etapes pour devenir FS - +[Documentation Fournisseur](../README.md) > [Je veux devenir Fournisseur de Service](../README.md#je-veux-devenir-fournisseur-de-service) > Quelles sont les étapes pour devenir Fournisseur de Service ? --- # Quelles sont les étapes pour devenir Fournisseur de Service ? -1. Vous consultez les conditions d'éligibilité à FranceConnect. Les conditions juridiques, de sécurité et de qualité de service sont détaillées dans nos [conditions générales d'utilisation](https://partenaires.franceconnect.gouv.fr/cgu). Le cadre d'implémentation et d'intégration est détaillé dans nos [spécifications ergonomiques](https://partenaires.franceconnect.gouv.fr/fcp/fournisseur-service#acceptance) **TODO** *mettre à jour le lien* . +1. Vous consultez les conditions d'éligibilité à FranceConnect. Les conditions juridiques, de sécurité et de qualité de service sont détaillées dans nos [conditions générales d'utilisation](https://partenaires.franceconnect.gouv.fr/cgu). Le cadre d'implémentation et d'intégration est détaillé dans nos [spécifications ergonomiques](../technique/technique-boutons-fc.md). -2. Vous soumettez une demande d'habilitation via [datapass.api.gouv.fr](https://datapass.api.gouv.fr/) et vous transmettez toutes les informations nécessaires à la validation de votre demande (respect du RGPD, contact du responsable technique, niveau de garantie eIDAS souhaité, données d'identité recueillies, etc). Votre demande est validée par le service juridique de la DINUM dans un délai moyen de 5 jours ouvrés. +2. Vous soumettez une demande d'habilitation via [datapass.api.gouv.fr](https://datapass.api.gouv.fr/franceconnect) et vous transmettez toutes les informations nécessaires à la validation de votre demande (respect du RGPD, contact du responsable technique, niveau de garantie eIDAS souhaité, données d'identité recueillies, etc). Votre demande est validée par le service juridique de la DINUM dans un délai moyen de 5 jours ouvrés. -3. ~~Si votre demande est acceptée, votre responsable technique reçoit un mail lui donnant accès à l'[espace partenaire](https://partenaires.franceconnect.gouv.fr/login). Cet espace vous permettra d'accéder aux ressources de développement et de test~~. +3. Si votre demande est acceptée, vous devez faire une demande pour pouvoir accéder à l'environnement d'intégration FranceConnect+. Celui-ci vous permettra de réaliser vos développements. Pour faire votre demande, il est nécessaire d'utiliser la démarche en ligne suivante : https://www.demarches-simplifiees.fr/commencer/demande-de-creation-d-un-fs-fc-plus. Veillez à bien préciser lors de votre demande concerne l'environnement d'intégration FranceConnect+ -*Actuellement, notre espace partenaire n'est pas disponible pour FranceConnect+, pour cela, nous vous invitons à vous rapprocher du support partenaire pour accéder à vos ressources de développement et de test FranceConnect+* 4. Vous présentez vos développements pour une qualification par l'équipe FranceConnect. La durée de cette phase de qualification dépend du [respect des prérequis ](https://partenaires.franceconnect.gouv.fr/monprojet/recetter/)(techniques, sécurité, fonctionnels, UX...). N'hésitez pas à soumettre vos maquettes de parcours en amont pour une pré-qualification fonctionnelle et UX anticipée. -5. Si votre implémentation est validée par notre équipe, vous recevez vos secrets pour passer en production. - - - - +5. Si votre implémentation est validée par notre équipe, vous recevez vos secrets pour passer en production. Pour cela, il est nécessaire d'utiliser la démarche en ligne suivante pour les demander : https://www.demarches-simplifiees.fr/commencer/demande-de-creation-d-un-fs-fc-plus. Veillez à bien préciser lors de votre demande concerne l'environnement de production FranceConnect+. --- Voir aussi : -- [Acteurs à impliquer](pilotage-demarches-acteurs.md) +- [Quels sont les acteurs à impliquer dans l'intégration de FranceConnect+ ?](pilotage-demarches-acteurs.md) +- [Comment effectuer ma demande d'habilitation pour FranceConnect+ ?](../projet/projet-datapass.md) diff --git a/fs/pilotage/pilotage-integrer-fc+-apres-fc.md b/fs/pilotage/pilotage-integrer-fc+-apres-fc.md index c67bc8a..591b7b4 100644 --- a/fs/pilotage/pilotage-integrer-fc+-apres-fc.md +++ b/fs/pilotage/pilotage-integrer-fc+-apres-fc.md @@ -1,4 +1,4 @@ -[Documentation Fournisseur de Service](../../README.md) > [Devenir Fournisseur de Service FranceConnect+](../../README.md#je-veux-devenir-fournisseur-de-service) > Intégrer FranceConnect+ lorsque je suis déjà Fournisseur de Service pour FranceConnect +[Documentation Fournisseur](../README.md) > [Je veux devenir Fournisseur de Service](../README.md#je-veux-devenir-fournisseur-de-service) > Je suis déjà Fournisseur de Service pour FranceConnect, que dois je faire en plus pour devenir Fournisseur de Service pour FranceConnect+ ? --- @@ -29,4 +29,12 @@ Les plateformes FranceConnect et FranceConnect+ reposent toutes les deux sur le FranceConnect et FranceConnect+ fournissent un identifiant technique permettant d'identifier de manière unique un utilisateur pour votre service. Par défaut, cette identifiant est différent sur les deux plateforme. Il vous est possible, si vous en avez le besoin, de recevoir le même identifiant pour un même utilisateur pour votre service pour les deux plateformes. -Pour pouvoir en bénéficier, il suffit de le préciser lors de votre demande de création de votre fournisseur de service. \ No newline at end of file +Pour pouvoir en bénéficier, il suffit de le préciser lors de votre demande de création de votre fournisseur de service. + +--- + +Voir aussi : + +- [Comment effectuer ma demande d'habilitation pour FranceConnect+ ?](../projet/projet-datapass.md) +- [Comment puis-je réaliser des tests de FranceConnect+ avant de soumettre ma demande d'habilitation ?](../projet/projet-tests-sans-datapass.md) +- [Comment FranceConnect+ utilise le protocole OpenId Connect ?](../technique/technique-oidc-fc.md) \ No newline at end of file diff --git a/fs/projet/projet-datapass.md b/fs/projet/projet-datapass.md index 20e2ea8..590e79f 100644 --- a/fs/projet/projet-datapass.md +++ b/fs/projet/projet-datapass.md @@ -1,4 +1,4 @@ - +[Documentation Fournisseur de Service](../README.md) > [Je gère un projet d'intégration de FranceConnect+](../README.md#je-veux-devenir-fournisseur-de-service) > Comment effectuer ma demande d'habilitation pour FranceConnect+ ? --- diff --git a/fs/projet/projet-donnees-fc+.md b/fs/projet/projet-donnees-fc+.md index f5241f0..c9326fd 100644 --- a/fs/projet/projet-donnees-fc+.md +++ b/fs/projet/projet-donnees-fc+.md @@ -1,4 +1,4 @@ -[Documentation Fournisseur de Service](../README.md) > [Gerer un projet d'integration FranceConnect+](../README.md#je-veux-devenir-fournisseur-de-service) > Quelles sont les données que je peux récupérer par FranceConnect+ sur mes usagers ? +[Documentation Fournisseur de Service](../README.md) > [Je gère un projet d'intégration de FranceConnect+](../README.md#je-veux-devenir-fournisseur-de-service) > Quelles sont les données que je peux récupérer par FranceConnect+ sur mes usagers ? --- diff --git a/fs/projet/projet-niveau-eidas.md b/fs/projet/projet-niveau-eidas.md index f5e26cb..e72b29f 100644 --- a/fs/projet/projet-niveau-eidas.md +++ b/fs/projet/projet-niveau-eidas.md @@ -1,4 +1,4 @@ -[Documentation Fournisseur de Service](../README.md) > [Gerer un projet d'integration FranceConnect+](../README.md#je-g%C3%A8re-un-projet-dint%C3%A9gration-de-franceconnect) > eIDAS +[Documentation Fournisseur de Service](../README.md) > [Je gère un projet d'intégration de FranceConnect+](../README.md#je-g%C3%A8re-un-projet-dint%C3%A9gration-de-franceconnect) > eIDAS --- diff --git a/fs/projet/projet-tests-sans-datapass.md b/fs/projet/projet-tests-sans-datapass.md index 78752c7..502abe9 100644 --- a/fs/projet/projet-tests-sans-datapass.md +++ b/fs/projet/projet-tests-sans-datapass.md @@ -1,3 +1,4 @@ +[Documentation Fournisseur de Service](../README.md) > [Comment puis-je réaliser des tests de FranceConnect+ avant de soumettre ma demande d'habilitation ?](../README.md#je-g%C3%A8re-un-projet-dint%C3%A9gration-de-franceconnect) > eIDAS --- diff --git a/fs/technique/technique-boutons-fc.md b/fs/technique/technique-boutons-fc.md index 5e63506..8dea5b0 100644 --- a/fs/technique/technique-boutons-fc.md +++ b/fs/technique/technique-boutons-fc.md @@ -1,4 +1,4 @@ -[Documentation Fournisseur](../README.md) > [J'intègre FranceConnect+ dans mon service en ligne](../README.md#jintègre-franceconnect-dans-mon-service-en-ligne) > Comment intégrer le bouton FranceConnect+ à mon service ? +[Documentation Fournisseur de Service](../README.md) > [J'intègre FranceConnect+ dans mon service en ligne](../README.md#jintègre-franceconnect-dans-mon-service-en-ligne) > Comment intégrer le bouton FranceConnect+ à mon service ? --- @@ -54,7 +54,7 @@ Le bouton FranceConnect+ **doit être distinct de vos moyens de connexion natifs - une séparation visible doit être mise en place entre eux ; - la mention "OU" doit également y figurer afin de faire comprendre à l'utilisateur qu'il peut choisir entre FranceConnect+ ou un autre mode de connexion/d'inscription. -![Intégration du bouton FranceConnect+ dans la page](../images/technique/techniqiue-guidelines-fc%2B-position.png) +![Intégration du bouton FranceConnect+ dans la page](../images/technique/technique-guidelines-fc%2B-position.png) ### Intégration dans votre service. diff --git a/fs/technique/technique-deconnexion.md b/fs/technique/technique-deconnexion.md index 77d9ac1..e86a6c7 100644 --- a/fs/technique/technique-deconnexion.md +++ b/fs/technique/technique-deconnexion.md @@ -1,4 +1,4 @@ -[Documentation Fournisseur](../README.md) > [J'intègre FranceConnect+ dans mon service en ligne](../README.md#jintègre-franceconnect-dans-mon-service-en-ligne) > Comment déconnecter un utilisateur de FranceConnect+ ? +[Documentation Fournisseur de Service](../README.md) > [J'intègre FranceConnect+ dans mon service en ligne](../README.md#jintègre-franceconnect-dans-mon-service-en-ligne) > Comment déconnecter un utilisateur de FranceConnect+ ? --- diff --git a/fs/technique/technique-eidas.md b/fs/technique/technique-eidas.md index 17e045b..92c1d20 100644 --- a/fs/technique/technique-eidas.md +++ b/fs/technique/technique-eidas.md @@ -1,4 +1,4 @@ -[Documentation Fournisseur](../README.md) > [J'intègre FranceConnect+ dans mon service en ligne](../README.md#jintègre-franceconnect-dans-mon-service-en-ligne) > Comment utiliser les niveaux de garantie eIDAS sur FranceConnect+ ? +[Documentation Fournisseur de Service](../README.md) > [J'intègre FranceConnect+ dans mon service en ligne](../README.md#jintègre-franceconnect-dans-mon-service-en-ligne) > Comment utiliser les niveaux de garantie eIDAS sur FranceConnect+ ? --- diff --git a/fs/technique/technique-endpoints.md b/fs/technique/technique-endpoints.md index 208bf2d..d9485f7 100644 --- a/fs/technique/technique-endpoints.md +++ b/fs/technique/technique-endpoints.md @@ -1,8 +1,12 @@ -# FranceConnect+ Endpoints +[Documentation Fournisseur de Service](../README.md) > [J'intègre FranceConnect+ dans mon service en ligne](../README.md#jintègre-franceconnect-dans-mon-service-en-ligne) > Comment utiliser les différents Endpoints FranceConnect+ ? + +--- + +# Comment utiliser les différents Endpoints FranceConnect+ ? FranceConnect+ met en oeuvre le protocole OpenID Connect pour permettre à un Fournisseur de Services de déléguer à FranceConnect+ l'identification et l'authentification des agents. -#### Openid Configuration Endpoints +### Openid Configuration Endpoints
GET /api/v2/.well-known/openid-configuration @@ -64,7 +68,7 @@ https://auth.integ01.dev-franceconnect.fr/api/v2/jwks
-#### Authorization Endpoint +### Authorization Endpoint
GET /api/v2/authorize @@ -167,7 +171,7 @@ https://openid.net/specs/openid-connect-core-1_0.html#AuthorizationEndpoint
-#### Redirection vers le FS après erreur de connexion +### Redirection vers le FS après erreur de connexion
GET <FS_URL>/<URL_CALLBACK> @@ -199,7 +203,7 @@ Exemple de retour vers le FS de mock
-#### Redirection vers le FS après connexion +### Redirection vers le FS après connexion
GET <FS_URL>/<URL_CALLBACK> @@ -229,7 +233,7 @@ Exemple de retour vers le FS de mock
-#### Token Endpoint +### Token Endpoint
POST /api/v2/token @@ -278,7 +282,7 @@ Voir le format de l'[id_token](../doc_fs.md#id_token).
-#### UserInfo Endpoint +### UserInfo Endpoint
GET /api/v2/userinfo @@ -354,7 +358,7 @@ http://openid.net/specs/openid-connect-session-1_0.html#RPLogout
-#### Redirection vers le FS après déconnexion +### Redirection vers le FS après déconnexion
GET <FS_URL>/<POST_LOGOUT_REDIRECT_URI> @@ -380,4 +384,12 @@ Exemple de retour vers le FS de mock à déconnexion > Host: fsa1v2.integ01.dev-agentconnect.fr > ``` -
\ No newline at end of file + + +--- + +Voir aussi : + +* [Comment FranceConnect+ utilise le protocole OpenId Connect ?](./technique-env-fc.md) +* [Comment utiliser les scopes OpenID Connect pour accéder aux données des utilisateurs ?](./technique-scope-fc.md) + diff --git a/fs/technique/technique-env-fc.md b/fs/technique/technique-env-fc.md index 3ede20e..ba5e00b 100644 --- a/fs/technique/technique-env-fc.md +++ b/fs/technique/technique-env-fc.md @@ -31,11 +31,12 @@ Les adresses de notre environnement d'intégration sont les suivantes : | EndPoint | Adresse | | ------ | ------ | -| Discovery URL | https://auth.integ01.dev-franceconnect.fr/api/v2/.well-known/openid-configuration | -| Authorization | https://auth.integ01.dev-franceconnect.fr/api/v2/authorize | -| Token | https://auth.integ01.dev-franceconnect.fr/api/v2/token | -| UserInfo | https://auth.integ01.dev-franceconnect.fr/api/v2/userinfo | -| Logout | https://auth.integ01.dev-franceconnect.fr/api/v2/session/end | +| [Discovery URL](technique-endpoints.md#openid-configuration-endpoints) | https://auth.integ01.dev-franceconnect.fr/api/v2/.well-known/openid-configuration | +| [JWKS URL](technique-endpoints.md#openid-configuration-endpoints) | https://auth.integ01.dev-franceconnect.fr/api/v2/jwks | +| [Authorization](technique-endpoints.md#authorization-endpoint) | https://auth.integ01.dev-franceconnect.fr/api/v2/authorize | +| [Token](technique-endpoints.md#token-endpoint) | https://auth.integ01.dev-franceconnect.fr/api/v2/token | +| [UserInfo](technique-endpoints.md#userinfo-endpoint) | https://auth.integ01.dev-franceconnect.fr/api/v2/userinfo | +| [Logout](technique-endpoints.md#logout-endpoint) | https://auth.integ01.dev-franceconnect.fr/api/v2/session/end | ## Accès à l'environnement de production FranceConnect+ @@ -58,15 +59,18 @@ Les adresses de notre environnement de production sont les suivantes : | EndPoint | Adresse | | ------ | ------ | -| Discovery URL | https://auth.franceconnect.gouv.fr/api/v2/.well-known/openid-configuration | -| Authorization | https://auth.franceconnect.gouv.fr/api/v2/authorize | -| Token | https://auth.franceconnect.gouv.fr/api/v2/token | -| UserInfo | https://auth.franceconnect.gouv.fr/api/v2/userinfo | -| Logout | https://auth.franceconnect.gouv.fr/api/v2/session/end | +| [Discovery URL](technique-endpoints.md#openid-configuration-endpoints) | https://auth.franceconnect.gouv.fr/api/v2/.well-known/openid-configuration | +| [JWKS URL](technique-endpoints.md#openid-configuration-endpoints) | https://auth.franceconnect.gouv.fr/api/v2/jwks | +| [Authorization](technique-endpoints.md#authorization-endpoint) | https://auth.franceconnect.gouv.fr/api/v2/authorize | +| [Token](technique-endpoints.md#token-endpoint) | https://auth.franceconnect.gouv.fr/api/v2/token | +| [UserInfo](technique-endpoints.md#userinfo-endpoint) | https://auth.franceconnect.gouv.fr/api/v2/userinfo | +| [Logout](technique-endpoints.md#logout-endpoint) | https://auth.franceconnect.gouv.fr/api/v2/session/end | --- Voir aussi : -- [Comment effectuer ma demande d'habilitation pour FranceConnect+ ?](../projet/projet-datapass.md) \ No newline at end of file +- [Comment effectuer ma demande d'habilitation pour FranceConnect+ ?](../projet/projet-datapass.md) +- [Quels échanges ont lieu entre mon service et FranceConnect+ lors d'une cinématique ?](./technique-oidc-flux.md) +- [Comment utiliser les différents Endpoints FranceConnect+ ?](technique-endpoints.md) diff --git a/fs/technique/technique-erreurs.md b/fs/technique/technique-erreurs.md index e69de29..680f9f5 100644 --- a/fs/technique/technique-erreurs.md +++ b/fs/technique/technique-erreurs.md @@ -0,0 +1,15 @@ +[Documentation Fournisseur](../README.md) > [J'intègre FranceConnect+ dans mon service en ligne](../README.md#jintègre-franceconnect-dans-mon-service-en-ligne) > Comment gérer les erreurs renvoyées par FranceConnect+ ? + +--- + +# Comment gérer les erreurs renvoyées par FranceConnect+ ? + +En tant qu'OpenID Connect provider, FranceConnect+ peut renvoyer toutes sortes d'erreurs à une application cliente. Pour ce faire, FranceConnect+ passe par le mécanisme de retour d'erreurs d'un fournisseur d'identité openid connect tel que décrit dans la norme ( http://openid.net/specs/openid-connect-core-1_0.html#AuthError, en particulier les sections 3.1.2.6 (authentification), 3.1.3.4 (jeton d'accès), 5.3.3 (service d'informations utilisateur) ) + + +--- + +Voir aussi : + +- [Comment FranceConnect+ utilise le protocole OpenId Connect ?](technique-oidc-fc.md) +- [Qu'est ce que le protocole OpenID Connect ?](technique-oidc.md) \ No newline at end of file diff --git a/fs/technique/technique-glossaire.md b/fs/technique/technique-glossaire.md index d0265e5..5bb7e39 100644 --- a/fs/technique/technique-glossaire.md +++ b/fs/technique/technique-glossaire.md @@ -1,18 +1,21 @@ # Glossaire #### **FC_URL:** -URL de FranceConnect+ +Il s'agit le l'URL de l'environnement FranceConnect+ que vous utiliser: +- [integration](technique-env-fc.md#acc%C3%A8s-%C3%A0-lenvironnement-dint%C3%A9gration) : https://auth.integ01.dev-franceconnect.fr +- [production](technique-env-fc.md#acc%C3%A8s-%C3%A0-lenvironnement-de-production) : https://auth.franceconnect.gouv.fr #### **FS_URL:** -Votre URL, en tant que fournisseur de service +Il s'agit de l'URLde votre fournisseur de service -#### **FD_URL:** -URL du fournisseur de données #### **CALLBACK_URL_DATA:** le callback du FS, communiqué lors de son inscription auprès de FC + #### **POST_LOGOUT_REDIRECT_URI:** -L'URL de redirection après la demande de déconnexion FC +Il s'agit de l'URL de votre fournisseur de service vers laquelle l'usager va être redirigée une fois l'utilisateur déconnecté de FranceConnect+. + +[plus d'info](https://openid.net/specs/openid-connect-rpinitiated-1_0.html#RedirectionAfterLogout) #### **CLIENT_ID:** Identifiant du FS, communiqué lors de son inscription auprès de FC @@ -27,6 +30,7 @@ Code retourné (dans l'URL) par FC au FS lorsque ce dernier fait un appel sur le Token retourné (dans le corps HTTP) par l'appel au endpoint FC_URL/api/v2/token. Il est ensuite passé lors de l'appel au endpoint FC_URL/api/v2/userinfo #### **SCOPES:** +Les scopes permettent de définir Liste des scopes demandés séparés par des espaces (donc par %20 au format unicode dans l'URL) Voici la liste supportée par FranceConnect+ : diff --git a/fs/technique/technique-oidc-fc.md b/fs/technique/technique-oidc-fc.md index 7054143..0db6db5 100644 --- a/fs/technique/technique-oidc-fc.md +++ b/fs/technique/technique-oidc-fc.md @@ -90,8 +90,8 @@ Les clés publiques de signature de FranceConnect+ sont disponibles via la *JWKS | Environnement | adresses du endpoint | | ------ | ------ | -| intégration FC | https://auth.integ01.dev-franceconnect.fr/api/v2/jwks | -| production FC | https://auth.franceconnect.gouv.fr/api/v2/jwks | +| intégration | https://auth.integ01.dev-franceconnect.fr/api/v2/jwks | +| production | https://auth.franceconnect.gouv.fr/api/v2/jwks | #### Exposition des clés de chiffrement diff --git a/fs/technique/technique-oidc-flux.md b/fs/technique/technique-oidc-flux.md index 8c72a44..b316ce4 100644 --- a/fs/technique/technique-oidc-flux.md +++ b/fs/technique/technique-oidc-flux.md @@ -10,8 +10,7 @@ Le diagramme de flux représente entre l'utilisateur, FranceConnect+ et votre service est le suivant. - -drawing +![diagramme de séquence FS](../diagrams/diagram-sequence-fs-fc.png) La récupération de l'identité pivot doit être faite dans la suite immédiate des appels précédents (authentification et récupération du code). Le fait d'appeler ce Web service plus tard n'est aujourd'hui pas proposé. From d75d14b57032795a180a6ca80c9deeabd70207cf Mon Sep 17 00:00:00 2001 From: Benjamin Ratti Date: Mon, 16 Jan 2023 16:50:43 +0100 Subject: [PATCH 30/37] doc(fs) ajout eidas --- .../projet-fonctionnement-noeud-eidas.md | 10 +++++ fs/projet/projet-niveau-eidas.md | 25 +++++++++++++ fs/technique/technique-eidas-identite-eu.md | 37 +++++++++++++++++++ 3 files changed, 72 insertions(+) create mode 100644 fs/projet/projet-fonctionnement-noeud-eidas.md create mode 100644 fs/technique/technique-eidas-identite-eu.md diff --git a/fs/projet/projet-fonctionnement-noeud-eidas.md b/fs/projet/projet-fonctionnement-noeud-eidas.md new file mode 100644 index 0000000..01af2a8 --- /dev/null +++ b/fs/projet/projet-fonctionnement-noeud-eidas.md @@ -0,0 +1,10 @@ + + +## Quel est l'objectif du noeud d'intéropérabilité eIDAS + +Dans le cadre du règlement eIDAS, chaque état membre met à disposition un noeud d'intéropérabilité eIDAS qui permet à tout citoyen européen d'accéder à des fournisseurs de service d'un autre état membre en utilisant un schéma d'identification d'un autre état membre. + +Au niveau de la France, le noeud d'intéropérabilité est opéré par la DINUM au même titre que FranceConnect+. + +### Comment un fournisseur de service peut utiliser + diff --git a/fs/projet/projet-niveau-eidas.md b/fs/projet/projet-niveau-eidas.md index e72b29f..647fbca 100644 --- a/fs/projet/projet-niveau-eidas.md +++ b/fs/projet/projet-niveau-eidas.md @@ -48,4 +48,29 @@ Le tableau ci-dessous récapitule les niveaux supportés par les deux plateforme | substantiel | Non | Oui |  | élevé | Non | A venir | +## Schéma d'identification européen et passelle d'interopérabilité + +Le règlement eIDAS demande aux états membre de se doter d'un schéma d'identification et de le rendre interopérable avec les aux états membre européen. + +Le schéma d'identification est le mécanisme d'un pays qui permet à un usager de s'authentifier et de s'identifier. + +L'objectif est de permettre à un usager d'un état membre d'accéder aux service d'un autre état membre en utilisant le schéma d'identification qu'il utilise habituellement. Cela peut permettre, par exemple, à un usager français d'accéder au service des impots belges. + +Actuellement, la France ne dispose que d'un seul schéma d'identification utilisable par les autres états membre, il s'agit de FranceConnect+ combiné avec L'identité Numérique La Poste. Cependant, cela ne concerne que les services des autres états membres. + +Il est possible pour un fournisseur de service d'utiliser les schémas d'identification d'un autre état membre. + +## Quels sont les niveaux de garantie accessible via les schémas d'identification des autres états membre ? + +Les niveaux de garanties utilisables via les schémas d'idenitification des autres états membre sont les niveaux substantiels et élevés. Il n'est pas possible de demandés ou d'obtenir des identités de niveau de garantie faible via les schémas d'identification des autres états membres. + +## Comment utiliser les schémas d'identification des autres états membres ? + +L'accès aux schémas d'identification des autres états membres se fait exclusivement via la plateforme FranceConnect+. C'est la DINUM, qui opère FranceConnect et FranceConnect+, qui est chargé de faire le lien entre la plateforme FranceConnect+ et les schémas d'identification des autres états membre. + +### Comment avoir accès aux autres schémas d'identifications européens pour mon fournisseur de service ? + +### Comment l'usager d'un autre état membre doit il faire pour accéder à un autre service + + --- \ No newline at end of file diff --git a/fs/technique/technique-eidas-identite-eu.md b/fs/technique/technique-eidas-identite-eu.md new file mode 100644 index 0000000..67b940c --- /dev/null +++ b/fs/technique/technique-eidas-identite-eu.md @@ -0,0 +1,37 @@ +[Documentation Fournisseur](../README.md) > [J'intègre FranceConnect+ dans mon service en ligne](../README.md#jintègre-franceconnect-dans-mon-service-en-ligne) > Comment récupérer les données d'identités provenant d'un pays européens via la noeud eIDAS français ? + +--- + +# Comment récupérer les données d'identités provenant d'un pays européens via la noeud eIDAS français ? + +Il est possible de permettre aux usagers des autres pays européens d'accéder à votre service en s'authentifiant avec le schéma d'identification de leur pays. + +Pour votre service, cela se passe en utilisant la plateforme FranceConnect+. + +## Quelles sont les données d'identité accessible pour un usager européen ? + +| Claim | Obligatoire | Commentaire | +| ------ | ------ | ------ | +| openid | X | même format que pour une identité française | +| gender | | `male`, `female` ou `unspecified` | +| birthdate | X | même format que pour une identité française, ne gère pas les présumés nées| +| birthplace | | Ne correspond pas à un COG. Le format est libre pour chaque pays. | +| given_name | X | Correspond au prénom de la personne. Ce n'est pa obligatoirement le prénom de naissance.| +| family_name | X | Contient le nom d'usage de la personne | + + + +## Comment savoir s'il s'agit d'une identité provenant d'un fournisseur d'identité français ou d'une identité européenne ? + +Cette information est indiqué dans le claim *amr* qui peut contenir plusieurs valeurs. Il est nécessaire de demander cette information via la demande du claim spécifique *amr*. + +| Valeur | Origine de l'identité | +| ------ | --------------------- | +| fr | identité provenant d'un fournisseur d'identité français | +| eidas | identité provenant d'un schéma d'identité d'un autre pays | + +--- + +Voir aussi : + +- [Qu'est ce qu'eIDAS et quels sont les niveaux de garantie de FranceConnect+ ?](../projet/projet-niveau-eidas.md) From 1256cde96ac4b7c2eeb423d8a5ec5b8a163e5344 Mon Sep 17 00:00:00 2001 From: Benjamin Ratti Date: Thu, 23 Feb 2023 09:23:02 +0100 Subject: [PATCH 31/37] doc(fs) : mise en page pilotage etapes --- fs/pilotage/pilotage-etapes.md | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/fs/pilotage/pilotage-etapes.md b/fs/pilotage/pilotage-etapes.md index 7a8fa0d..bac56b4 100644 --- a/fs/pilotage/pilotage-etapes.md +++ b/fs/pilotage/pilotage-etapes.md @@ -1,18 +1,28 @@ [Documentation Fournisseur](../README.md) > [Je veux devenir Fournisseur de Service](../README.md#je-veux-devenir-fournisseur-de-service) > Quelles sont les étapes pour devenir Fournisseur de Service ? --- -# Quelles sont les étapes pour devenir Fournisseur de Service ? -1. Vous consultez les conditions d'éligibilité à FranceConnect. Les conditions juridiques, de sécurité et de qualité de service sont détaillées dans nos [conditions générales d'utilisation](https://partenaires.franceconnect.gouv.fr/cgu). Le cadre d'implémentation et d'intégration est détaillé dans nos [spécifications ergonomiques](../technique/technique-boutons-fc.md). +### 1. Vérifier les conditions d'éligibilité -2. Vous soumettez une demande d'habilitation via [datapass.api.gouv.fr](https://datapass.api.gouv.fr/franceconnect) et vous transmettez toutes les informations nécessaires à la validation de votre demande (respect du RGPD, contact du responsable technique, niveau de garantie eIDAS souhaité, données d'identité recueillies, etc). Votre demande est validée par le service juridique de la DINUM dans un délai moyen de 5 jours ouvrés. +Vous consultez les conditions d'éligibilité à FranceConnect. Les conditions juridiques, de sécurité et de qualité de service sont détaillées dans nos +
conditions générales d'utilisations. Le cadre d'implémentation et d'intégration est détaillé dans nos [spécifications ergonomiques](../technique/technique-boutons-fc.md).# Quelles sont les étapes pour devenir Fournisseur de Service ? -3. Si votre demande est acceptée, vous devez faire une demande pour pouvoir accéder à l'environnement d'intégration FranceConnect+. Celui-ci vous permettra de réaliser vos développements. Pour faire votre demande, il est nécessaire d'utiliser la démarche en ligne suivante : https://www.demarches-simplifiees.fr/commencer/demande-de-creation-d-un-fs-fc-plus. Veillez à bien préciser lors de votre demande concerne l'environnement d'intégration FranceConnect+ +### 2. Demander votre habilitation -4. Vous présentez vos développements pour une qualification par l'équipe FranceConnect. La durée de cette phase de qualification dépend du [respect des prérequis ](https://partenaires.franceconnect.gouv.fr/monprojet/recetter/)(techniques, sécurité, fonctionnels, UX...). N'hésitez pas à soumettre vos maquettes de parcours en amont pour une pré-qualification fonctionnelle et UX anticipée. +Vous soumettez une demande d'habilitation via le formulaire datapass FranceConnect et vous transmettez toutes les informations nécessaires à la validation de votre demande (respect du RGPD, contact du responsable technique, niveau de garantie eIDAS souhaité, données d'identité recueillies, etc). Votre demande est validée par le service juridique de la DINUM dans un délai moyen de 5 jours ouvrés. -5. Si votre implémentation est validée par notre équipe, vous recevez vos secrets pour passer en production. Pour cela, il est nécessaire d'utiliser la démarche en ligne suivante pour les demander : https://www.demarches-simplifiees.fr/commencer/demande-de-creation-d-un-fs-fc-plus. Veillez à bien préciser lors de votre demande concerne l'environnement de production FranceConnect+. +### 3. Réaliser votre intégration + +Si votre demande est acceptée, vous devez faire une demande pour pouvoir accéder à l'environnement d'intégration FranceConnect+. Celui-ci vous permettra de réaliser vos développements. Pour faire votre demande, il est nécessaire d'utiliser la démarche en ligne suivante : https://www.demarches-simplifiees.fr/commencer/demande-de-creation-d-un-fs-fc-plus. Veillez à bien préciser lors de votre demande concerne l'environnement d'intégration FranceConnect+ + +### 4. Faire qualifier votre intégration + +Vous présentez vos développements pour une qualification par l'équipe FranceConnect. La durée de cette phase de qualification dépend du [respect des prérequis ](https://partenaires.franceconnect.gouv.fr/monprojet/recetter/)(techniques, sécurité, fonctionnels, UX...). N'hésitez pas à soumettre vos maquettes de parcours en amont pour une pré-qualification fonctionnelle et UX anticipée. + +### 5. Passer en production + +Si votre implémentation est validée par notre équipe, vous recevez vos secrets pour passer en production. Pour cela, il est nécessaire d'utiliser la démarche en ligne suivante pour les demander : [https://www.demarches-simplifiees.fr/commencer/demande-de-creation-d-un-fs-fc-plus](https://www.demarches-simplifiees.fr/commencer/demande-de-creation-d-un-fs-fc-plus). Veillez à bien préciser lors de votre demande concerne l'environnement de production FranceConnect+. --- From aac3a81d882120f61598ceaef62baa9368163119 Mon Sep 17 00:00:00 2001 From: Benjamin Ratti Date: Thu, 23 Feb 2023 10:06:15 +0100 Subject: [PATCH 32/37] =?UTF-8?q?doc(fs)=20:=20mise=20=C3=A0=20jour=20?= =?UTF-8?q?=C3=A9tapes=20de=20pilotages?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fs/pilotage/pilotage-etapes.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/fs/pilotage/pilotage-etapes.md b/fs/pilotage/pilotage-etapes.md index bac56b4..a83dea4 100644 --- a/fs/pilotage/pilotage-etapes.md +++ b/fs/pilotage/pilotage-etapes.md @@ -18,7 +18,12 @@ Si votre demande est acceptée, vous devez faire une demande pour pouvoir accéd ### 4. Faire qualifier votre intégration -Vous présentez vos développements pour une qualification par l'équipe FranceConnect. La durée de cette phase de qualification dépend du [respect des prérequis ](https://partenaires.franceconnect.gouv.fr/monprojet/recetter/)(techniques, sécurité, fonctionnels, UX...). N'hésitez pas à soumettre vos maquettes de parcours en amont pour une pré-qualification fonctionnelle et UX anticipée. +Vous devez présentez vos développements pour une qualification par l'équipe FranceConnect. La durée de cette phase de qualification dépend du respect des prérequis (techniques, sécurité, fonctionnels, UX...). N'hésitez pas à soumettre vos maquettes de parcours en amont pour une pré-qualification fonctionnelle et UX anticipée. + +Vous retrouvez l'ensemble des pré-requis dans la section *Recette interne* de la démarche simplifiée. + +Pour réaliser votre demande de qualification, vous devez utiliser la démarche en ligne suivante : https://www.demarches-simplifiees.fr/commencer/demande-qualification-fs-fcplus. Dans un premier temps, vous devez déjà réaliser par vous même une recette de votre intégration. Une fois votre recette réalisée, vous pouvez demander votre qualification par les équipes FranceConnect. + ### 5. Passer en production From 3e3d433c0ccb40c475e5ac2a570c2a3384c071de Mon Sep 17 00:00:00 2001 From: Benjamin Ratti Date: Thu, 23 Feb 2023 14:29:03 +0100 Subject: [PATCH 33/37] doc(fs) : ajout pilotage facturation --- fs/pilotage/pilotage-etapes.md | 1 + fs/pilotage/pilotage-facturation.md | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 fs/pilotage/pilotage-facturation.md diff --git a/fs/pilotage/pilotage-etapes.md b/fs/pilotage/pilotage-etapes.md index a83dea4..b2fe477 100644 --- a/fs/pilotage/pilotage-etapes.md +++ b/fs/pilotage/pilotage-etapes.md @@ -1,6 +1,7 @@ [Documentation Fournisseur](../README.md) > [Je veux devenir Fournisseur de Service](../README.md#je-veux-devenir-fournisseur-de-service) > Quelles sont les étapes pour devenir Fournisseur de Service ? --- +# Quelles sont les étapes pour devenir Fournisseur de Service ? ### 1. Vérifier les conditions d'éligibilité diff --git a/fs/pilotage/pilotage-facturation.md b/fs/pilotage/pilotage-facturation.md new file mode 100644 index 0000000..7756e86 --- /dev/null +++ b/fs/pilotage/pilotage-facturation.md @@ -0,0 +1,25 @@ +[Documentation Fournisseur](../README.md) > [Je veux devenir Fournisseur de Service](../README.md#je-veux-devenir-fournisseur-de-service) > L'usage de FranceConnect+ est-il payant? + +--- + +# L'usage de FranceConnect+ est-il payant? + +L'usage de FranceConnect+ n'entraine aucune compensation financière entre la DINUM et le fournisseur de service. Cependant, il peut nécessiter une relation contractuel avec les fournisseurs d'identités et entrainer une facturation de l'usage des identités. + +### Usage par les fournisseurs de service publics + +L'usage de FranceConnect+ est gratuit pour l'ensemble des fournisseurs de service public, quelque soit les fournisseurs d'identité utilisés par les usagers pour se connecter. + +### Usage par les fournisseurs de services privés + +Pour les fournisseurs de service privé, l'usage de FranceConnect+ nécessite une contractualisation avec l'ensemble des fournisseurs de service privé. Cela peut entrainer une facturation dépendant de la consommation des identités pour les fournisseurs de service. Dans ce cas, c'est la DINUM qui est en charge de fournir les volumétrie d'usages des fournisseurs d'identités par le fournisseur de service. + +L'usage des fournisseurs d'identité public est quant à lieu gratuit et ne nécessite pas de contractualisation entre le fournisseur de service et le fournisseur d'identité. + +**En bref :** L'usage de FranceConnect+ est payant pour les fournisseurs de service privés qui utilisent des fournisseurs de d'identité privés. + +--- + +Voir aussi : + +* [Quelles sont les différences entre FranceConnect et FranceConnect+ ?](../pilotage/pilotage-differences-fc-fc%2B.md) \ No newline at end of file From f6923276f3bce45c298488e861fef70adea44ea1 Mon Sep 17 00:00:00 2001 From: Benjamin Ratti Date: Thu, 23 Feb 2023 14:30:38 +0100 Subject: [PATCH 34/37] docs(fs) : correction pilotage facturation --- fs/pilotage/pilotage-facturation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/pilotage/pilotage-facturation.md b/fs/pilotage/pilotage-facturation.md index 7756e86..01ad473 100644 --- a/fs/pilotage/pilotage-facturation.md +++ b/fs/pilotage/pilotage-facturation.md @@ -12,7 +12,7 @@ L'usage de FranceConnect+ est gratuit pour l'ensemble des fournisseurs de servic ### Usage par les fournisseurs de services privés -Pour les fournisseurs de service privé, l'usage de FranceConnect+ nécessite une contractualisation avec l'ensemble des fournisseurs de service privé. Cela peut entrainer une facturation dépendant de la consommation des identités pour les fournisseurs de service. Dans ce cas, c'est la DINUM qui est en charge de fournir les volumétrie d'usages des fournisseurs d'identités par le fournisseur de service. +Pour les fournisseurs de service privé, l'usage de FranceConnect+ nécessite une contractualisation avec l'ensemble des fournisseurs d'identité privés. Cela peut entrainer une facturation dépendant de la consommation des identités pour les fournisseurs de service. Dans ce cas, c'est la DINUM qui est en charge de fournir les volumétrie d'usages des fournisseurs d'identités par le fournisseur de service. L'usage des fournisseurs d'identité public est quant à lieu gratuit et ne nécessite pas de contractualisation entre le fournisseur de service et le fournisseur d'identité. From e7738c3480e5ad3ca8ceb15894bb7e0e9b683dd2 Mon Sep 17 00:00:00 2001 From: Benjamin Ratti Date: Thu, 23 Feb 2023 14:56:46 +0100 Subject: [PATCH 35/37] =?UTF-8?q?doc(fs)=20:=20mise=20=C3=A0=20jour=20sect?= =?UTF-8?q?ion=20pilotage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fs/README.md | 11 ++--- fs/pilotage/README.md | 53 +++++++++++++++++++++++ fs/pilotage/pilotage-demarches-acteurs.md | 2 +- 3 files changed, 57 insertions(+), 9 deletions(-) create mode 100644 fs/pilotage/README.md diff --git a/fs/README.md b/fs/README.md index 7d7d884..d4105e2 100644 --- a/fs/README.md +++ b/fs/README.md @@ -11,16 +11,11 @@ Cette documentation est à destination des Fournisseurs de Service souhaitant in FranceConnect+ met à disposition du Fournisseur de Service des identités de niveau de garantie eIDAS Susbtantiel et Elevé. FranceConnect+ s'implémente sur une plateforme distincte de la plateforme FranceConnect qui reste dédiée aux identités de niveau de garantie "faible". -# Je veux devenir Fournisseur de Service +# Je veux devenir fournisseur de services -Vous souhaitez devenir Fournisseur de Service pour FranceConnect+, voici les questions à vous poser : - -* [Quelles sont les étapes pour devenir Fournisseur de Service ?](pilotage/pilotage-etapes.md) -* [Quels sont les différents acteurs que je dois faire intervenir dans mon organisation pour devenir Fournisseur de Service ?](pilotage/pilotage-demarches-acteurs.md) -* [Quelles sont les différences entre FranceConnect et FranceConnect+ ?](pilotage/pilotage-differences-fc-fc+.md) -* [Quels sont les fournisseurs d'identités disponible sur FranceConnect+ ? ](pilotage/piloge-fi.md) -* [Je suis déjà Fournisseur de Service pour FranceConnect, que dois je faire en plus pour devenir Fournisseur de Service pour FranceConnect+ ?](pilotage/pilotage-integrer-fc+-apres-fc.md) +Vous vous poser des questions sur le fonctionnement général de FranceConnect+ et de son écosystème. Vous touverez l'ensemble des réponses à vos questions dans cette section. +[Je veux devenir fournisseur de services](pilotage/README.md) # Je gère un projet d'intégration de FranceConnect+ diff --git a/fs/pilotage/README.md b/fs/pilotage/README.md new file mode 100644 index 0000000..2ce7f2d --- /dev/null +++ b/fs/pilotage/README.md @@ -0,0 +1,53 @@ +[Documentation Fournisseur](../README.md) > [Je veux devenir Fournisseur de Service](README.md) + +--- + +# Je veux devenir Fournisseur de Service + +Vous souhaitez devenir Fournisseur de Service pour FranceConnect+, voici les questions à vous poser. + +### Quelles sont les étapes pour devenir Fournisseur de Service ? + +Pour devenir fournisseur de service de FranceConnect+, vous devez réaliser les actions suivantes : + +1. vérifier les conditions d'éligibilité; +2. demander votre habilitation; +3. réaliser votre intégration; +4. faire qualifier votre intégration; +5. passer en production. + +[Plus d'informations](pilotage-etapes.md) + +### Quels sont les différents acteurs que je dois faire intervenir dans mon organisation pour devenir Fournisseur de Service ? + +Pour devenir fournisseur de service, vous devez faire intervenir des acteurs de votre organisation comme le responsable de traitement, votre délégué à la protection des données, votre RSSI ou votre responsable technique. + + +[Plus d'informations](pilotage-demarches-acteurs.md) + + +### Quelles sont les différences entre FranceConnect et FranceConnect+ ? + +La principale différences entre FranceConnect et FranceConnect+ est le niveau de garantie eIDAS supporté par la plateforme. + + [Plus d'informations](pilotage-differences-fc-fc+.md) + + ### L'usage de FranceConnect+ est-il payant ? + +L'usage de FranceConnect+ n'entraine aucune compensation financière entre la DINUM et le fournisseur de service. Cependant, il peut nécessiter une relation contractuel avec les fournisseurs d'identités et entrainer une facturation de l'usage des identités. + +[Plus d'informations](pilotage-facturation.md) + +### Quels sont les fournisseurs d'identités disponible sur FranceConnect+ ? + +La liste des fournisseurs d'identité est disponible sur le site internet de FranceConnect+. Il s'agit exclusivement de fournisseurs d'identité qualifié par l'ANSSI pour les niveau de garantie substantiel et élevé. + +[Plus d'informations](piloge-fi.md) + +### Je suis déjà Fournisseur de Service pour FranceConnect, que dois je faire en plus pour devenir Fournisseur de Service pour FranceConnect+ ? + +Si vous êtes fournisseur de service pour FranceConnect et que vous souhaitez devenir fournisseur de service pour FranceConnect+, vous devez : +- réaliser une nouvelle demande d'habilitation via datapass et - - réaliser quelques adaptions techniques pour intégrer les spécificités des FranceConnect+ +- demander une qualification par l'équipe FranceConnect + +[Plus d'informations](pilotage-integrer-fc+-apres-fc.md) diff --git a/fs/pilotage/pilotage-demarches-acteurs.md b/fs/pilotage/pilotage-demarches-acteurs.md index fa11690..8da80a0 100644 --- a/fs/pilotage/pilotage-demarches-acteurs.md +++ b/fs/pilotage/pilotage-demarches-acteurs.md @@ -1,4 +1,4 @@ -[Documentation Fournisseur](../README.md) > [Je veux devenir Fournisseur de Service](../README.md#je-veux-devenir-fournisseur-de-service) > Quels sont les acteurs à impliquer dans l'intégration de FranceConnect+ ? +[Documentation Fournisseur](../README.md) > [Je veux devenir Fournisseur de Service](README.md) > Quels sont les acteurs à impliquer dans l'intégration de FranceConnect+ ? --- From c80e3fe388299feebf8e72e7ceb92c37d8674382 Mon Sep 17 00:00:00 2001 From: Benjamin Ratti Date: Thu, 23 Feb 2023 18:35:01 +0100 Subject: [PATCH 36/37] docs(fs) : modidifcation de la section projet --- fs/README.md | 12 +--- fs/images/projet/projet-bouton-eidas.png | Bin 0 -> 9000 bytes fs/pilotage/piloge-fi.md | 2 +- fs/pilotage/pilotage-differences-fc-fc+.md | 2 +- fs/pilotage/pilotage-etapes.md | 4 +- fs/pilotage/pilotage-facturation.md | 2 +- fs/pilotage/pilotage-integrer-fc+-apres-fc.md | 2 +- fs/projet/README.md | 59 ++++++++++++++++++ fs/projet/projet-datapass.md | 4 +- fs/projet/projet-donnees-fc+.md | 2 +- fs/projet/projet-ecosysteme-fc+.md | 13 ++++ .../projet-fonctionnement-noeud-eidas.md | 45 ++++++++++++- fs/projet/projet-niveau-eidas.md | 28 ++------- fs/projet/projet-tests-sans-datapass.md | 2 +- 14 files changed, 132 insertions(+), 45 deletions(-) create mode 100644 fs/images/projet/projet-bouton-eidas.png create mode 100644 fs/projet/README.md diff --git a/fs/README.md b/fs/README.md index d4105e2..01c6b0d 100644 --- a/fs/README.md +++ b/fs/README.md @@ -13,21 +13,15 @@ FranceConnect+ s'implémente sur une plateforme distincte de la plateforme Franc # Je veux devenir fournisseur de services -Vous vous poser des questions sur le fonctionnement général de FranceConnect+ et de son écosystème. Vous touverez l'ensemble des réponses à vos questions dans cette section. +Vous vous poser des questions sur le fonctionnement général de FranceConnect+ et de son écosystème. Vous trouverez l'ensemble des réponses à vos questions dans cette section. [Je veux devenir fournisseur de services](pilotage/README.md) # Je gère un projet d'intégration de FranceConnect+ -Vous avez lancé un projet pour devenir FranceConnect+ et vous souhaiter connaitre les différentes problématique d'intégration de FranceConnect+, voici les questions à vous poser : +Vous allez ou vous avez lancé un projet pour devenir FranceConnect+ et vous souhaiter connaitre les différentes problématique d'intégration de FranceConnect+. Vous souhaitez avoir des informations précises sur les fonctionnement de FranceConnect+ pour gérer un projet d'intégration de FranceConnect+. Vous trouverez l'ensemble des réponses à vos questions dans cette section. -## Je souhaite savoir comment fonctionnement FranceConnect+ - -- [Quelles sont les données que je peux récupérer par FranceConnect+ sur mes usagers ?](projet/projet-donnees-fc+.md) -- [Qu'est ce qu'eIDAS et quels sont les niveaux de garantie de FranceConnect+ ?](projet/projet-niveau-eidas.md) -- [Quel est l'écosystème de FranceConnect+ ?](projet/projet-ecosysteme-fc+.md) -- [Comment puis-je réaliser des tests de FranceConnect+ avant de soumettre ma demande d'habilitation ?](projet-tests-sans-datapass.md) -- [Comment effectuer ma demande d'habilitation pour FranceConnect+ ?](../projet/projet-datapass.md) +[Je gère un projet d'intégration de FranceConnect+](projet/README.md) # J'intègre FranceConnect+ dans mon service en ligne diff --git a/fs/images/projet/projet-bouton-eidas.png b/fs/images/projet/projet-bouton-eidas.png new file mode 100644 index 0000000000000000000000000000000000000000..a1cc6ea337c29a8dbd2e2882625d942c51065028 GIT binary patch literal 9000 zcmbt)Wmr^E*EWKJNJ}>;DcugKq@dE>4Bbc!4bmmu0z-Gl&`5(w*U%t2(!u~E{S7?d zzvp^?yw`hv%syxK+H0>k=j^lgeMcxO%Hh1Ac!7d~f+PPyS``Ha)fRbf`Wzkk+xJy2 z2iZJzk(5_|jy!yxn}s8<$z5f%UDX^dT-{Ba%~32J9PQ0HTuhzK%^h5<99@smI>k{? z=uqUP->Z9M9usXiaA? zuO{z3Q#7F2t76L^Er^*}G(TWXSWEI*`Wxt_OB`9Q;HI%t^?lZDb9?qUmieN$?T6&+f zr?$u@7+;*-m>Uby=#|J<-yv|ZZ7p6KdjWHbsowJgSYe14G66OoXZ zu(~-xVEFq>+}zxt6E~cTXv3dcIdB?*^2<0g#{|`9W%TsC8w7*nR31ibG_FTP-`w6R z6XEDqN<`+-({jFa7CNb{oNU!%3ZwmEaW6IXyPH|vAf0YowivyX`g4a)n6 z4BN2>WR6pJUkd|`94z$^HK518>uVe%3^Y8E0`nn0|G57v zpPvE+9(tbBGIf7{$aFAXqVc1RJz?@SObAsL_|>j`vba;cJvqx~p0(D-u5zoW@YdUyqn|1&s1j8O{dHYF6H>X9PRw`PF;<0PO6 zU)M7O%i4~n)Qup4`Rb3qTCK`9x>yfRUF-9;&c(b>k$58!T)s;qz*B>! zMNhDP19HocW2SK}SpTZ&>vAg8w2I26hf3QIkX^b49?#R)K)w_$j1gKxdp#(>f{~$fq0Tf-`;qy)^s_bt%RxV6jFG-?)b*o! z5EM+)iwCuMNi2A#3b{DfskMbLntsvR>2ma|M$0k5f9>Nuo>g#r*RSOX*bv zGOdI;phWHcp!rx(71)~dbmREsQ@Mz?^pJn)H_zWZQ#4RKQ%Q)lxRXR{FELBv%W!O} z0S!FmSkD7%2|*3z_UeRzuTDjr9~flGdt}Q&@rim0Sy--{J(x7aiU;#1KSwx@uCg41 zoPH#k`?k{sk1lk@9L$6LiNyPh$I6!`I0z~XVsiz-y6~Br>iV?vF)ZVmKo{Ebq?VX*6|(D-ZT zzvZpb`fG4|79sPl zi?p=+)Z&Q<-hGrTabW&8b{}EPYueMxy#@U`;EDPIM=A3mX|8sY-_OC~3>EUvH%)xn z@z!(&O$qgNp9}nqjbT>|uB-NrZSJhr(QPa&*QC+7%&%Wzv-=1}HO$k5Is;VR4UmX& zbqZ(Hun~^exeUF;^?eXEPVEhEVzl6My_yJWB{^@V?AqGH@wOVO%G~!F;hC9z zJ@XWT4%J`(VMiKeeg06GE+es~6a=KRy!I*cYfZ>nEo%u~VM}kN1oFD@NbtmYGyowyizZw--V}QcZ~jrdp7e2iQrdDjdq-@SDUu!ii%9e4->d2l!vJB%7lx%i@b)Tun?qkO0j6J`4bR2w%A&KW%O{Ce97ac~%wSKY& z<&xSJ@gWjJe_Zd%A=^YZ+rGF|<+-&Q?@4*$OZi}l0&FB%<;SL9`pMaLAeY*90{pqm zJL`km7xkW6hV0$)QVX0TGTYipg86UqBfbeGqyS=PFyCiQRgg{T@T|LllKd3s`7EGf zWry3JaDZ3Uji)!gVz*GqlT&u*SV*zJGG9w$ctwARdSchqVYxh3iioo&grYq_<{DD^k?xR(Be{@ReTkmoRlqKM zYDgib=ys+)o4we0-|*L)eQR~%fluMgo`%BYMNULlF2^n3p=sp1eL~4DC3QbiZ&wV0 zAmR2h+dlek1Bt2gVIOY&u996s;TqbF$9eybv(*rVuvHW8QKtRtLqv?<(X>jhd$hYS z6WeBO1$)7Ft2#l)jUg7tfvU`WFV#86oy#z95u+nf@ihzN8vI3DnD}hRtEx>)7_GF3 z zO84eE?+Jf$U=itgX8MXJ3sp|6w0zWVSb?sufofPpkJT?UikMkBP6Lk zLvBnR<5@=`MvcGWSPUBRj4x*QrliVDJrx%lu>S?$;4C<`boB@LVEItDQX~Y>c|BY#HM3fR8D05@zc)f#& zwlc4lBfRFz`;t)sZFg8LKjJ68Fmq;q9f){;6(D&Iz_21ZfXHzlm*&7Zt=GFgb{a3F zsM?L{zG4pM3+2;Br0ZO{@Ckau+)@tbKQ34!zekG|I_(CTz-uZl(V`%Nm(eDHtJm+a zUpcF?hyHVVRa|I1^~Cbmg71u{`Nby5_!mqbMw7i$V@i1E5wk-kLY9_H;gb)0Xo<40 z{j6Kc#tkZavSn>KSTxoC=GpL_a%5%WGYyq4Ka!v@uy@(ilT#GiSFTdSk7U>DpcJ z;8v6b$6UrvL|;mcZDLWZDX6y^ zVme(b&nr#M=`w7LS`n2U8&3#75l@q3DvYbQd(m2@h{SZS zJUWRfvw;+vKyVCDH2t)&)!F(TmM9fK_ifxR$5@U&<l~(1H0rH6uJD zj1&zpF0R%c`}{Yznk<7PC)Mnwu9(B}57as_m!mHZtRm7O3BY5wtVF68RV27}tbI_{ zuahqkeN2&SzxvxbvTvSEvb?P!CNZ%Wi!vWJjA^oo7}g(dY!|RwZoq_N$p>3g&4Uhl z%W(g$67q&*Hoah7txXOr1jGOQx;y%1sCbtlh@2!7vYbK6x4*++d^09mBx_a5c}3V? zoQV%K-rbQ@0FeTRGUPIGXUaOZI)$2Jbfta_h|na~dKHbIZb8=bRVylgxBRH&&t>Ek zC>Fl$)xlHbNGdfNAmm@o`_m#hPaXLVQ7Pe0;xs!~|^t z{UQ68@f=YS9lt$U+|}LlLU}@6U$ud|RAj$x#<+ruqzOfGhYPAhUIN`Gw(_#Go)h&j z$+~+s?_yq4Xpfh_Lr^+yHGTVgO0Y)~LbzL&yYSayM!W;(H@WS(&I%S53hs`-kxwNRS$NMOC7n5(|%UzO%GCEmPE-kPTC?EuY<@&r~~?Nvk}3i2KO0{|QF&ptxLCB6pXV@Z&1; zgvj*8^dL>{KYj9)UUD)*h1&T{d@EyzDTqdS*%PAiL7vFn3T@R$aPYtyqQU?eVG^Md(~W*p+L!|1ayAgd>nY#xCNYq4cFN zky{O&%|bSR6N|l5z+0i~%Ey#8V5)XRr<{93Hv(R?$p+KPVk+OGEB7Bug)a`gssM=% zFsH<&M$awN_m>{&Q$k!#N%Q2hk7fhHv~p)cviID()8NyZk{qK zqK6>;UhQ)M`iPl-9a}WzdGo*^Lh#hH>5+o>Ssz!Ec$v(e~Af1GSwniv@qWl zUzfZK{+(n8e$$3CvJcV&a?>6&P+!ryM9m6uK9D*KQzGtu?i)J{ws4=BKdd+88R5G$ zl#GLAESK7Hb*0A`1$%q9>rlrkuRWWruQa{L3Jn{R3@C>7jk#3!WNUbdHSmTH0%Xs zKGS3NMbpkB0=-8}WBD2}-hsY<7rDd#b(RjcNo?)hHWA+m#wRQ-%Jpq(-jv!^04t>c z#XX>jV?{4sv>#r&CT>JfL(9l9+?d5k9n*M1)J>6^30Q(6zMwG!!)H-(D;$rvo2k2y z>t-7Z0LQ8)!n;fF&D@&lWFqEC-#&^K4m6(>Gb8D%i8E^Lcdn8~Ipc6@VBAbT-9WHM zj7!kyp0&%iO|D%w#D7$Hak|1!_5_qsTpF>@ZXQxd<^Cj}3HV2Q>iFtg7B%d8*l*mY z)e4xugs4yam7k2iKGeBx$UG~6F9P_EkN)L&x0(h%6?l$E`STJ^u%~<8=Y1@LLwlIl z46Rr3o;3vNQh!ZJ3yxrsS}7JI8}TGgPY8VfzJROpx@O6JEu2HJZ-9=^O_*WJ_k2hZMaN zqYoMa?}!7Ltk$)$!Wy>-cm+R8j(INbP zD*9PzPDA>GbG1VXC z&veiGPVa)HKjB&~7;kaZ!pq20YMDcOuY)icTv07f! zNNTB#jTtT)UvMPN6kD2JniI?>hnR6KMk%V)E{W~G$cXRG(K#Vu&72`z7E8=)3G_Ocd7Nfr z#KyFsvwvoQXHuZo>U5H1I(LR8EnJ-k*E$=-_Y-cT|Ed&^6ex1g<$wWH`;fsu&%eCt z^TVui<@^tdlbTl`s`Th)zd8C$uVd{2#x9tPOf)g9Ke;ce+!CQ*nIB=XekH(;E!s0Y zZpMAvreo$<+5Oisif5(LJh-~g)-*cpsI=Gw_$m|^Pc>^&dO5vb`ujIuL5M1iB5Wao zxc#p*leNTXegUWkb270J2vDNvRZ&c?udGQb^H%+E2$#)aWOBi2k@(n6mMbTwrj*4; zG@X~E=(!uu8Bpj+>EYK+gsqYrEF*22nch8>4sOyfG)>kaHK`{_%5(tC=|;9ZyDXD z%=sk*^C-juB|ZjGY*B-OzoY$;?=7XmUW$cEkofv_>{Pxe2 z_jbk4azrs#6>h2Kv{-+QtjOPhH0T+Az0ZYgMM7(O5yoIZz1J;bC)-Vk^-}YBc{@KASRZ& zwJ_{!?PMB>S;C1Eeo!0Y%xH`1_%0TY@o6%XR-6!*?a!FG9u~BZaA=)tNVnaD3r?CV&!lb z>3vMCs}YpFMj2$NiTs2g;yJJIw4k-UdmGhyPs6wMW)g|He2OWBmFnEnA*$u6>Tr&V zjzRYxA9l$|E}Wg~Dn9wT0EUFV1beL)R8@Q%sLtSSK=jzx#kVcEmHKY!Kah%NQT z5d{)yU!9ca?MkACvmVTnBdB3A#8t4E)*mVI=P5$IconuC{ftUWDF4sdw-!pyOzRVV zC{DWMfa%K;oD>^225${kqiEF{A;3FK=EG|yB&^u1k;Mhu?)RMM_j+W@CX~_2cT@(8C?~} zYuJ_hkIh(v62_TE5V9(hpv0Y!;t$c+I1yKjJsK#jIFSI41gnE z!L}q_wkFO$5xEB-5MOANW3oGk?E#AugX=f#a*(3xAW^bCiUHUCZNOnVYytz%t54#= z+VG5x6l|#1K8plG#Q@1DsCwW6OaMEhAdWs5zD~Bqo{RUs!)G`Dfpc3KgCMI&0I>JF zkj2V@*~46t*cp0tqmKw~UzX&5VY+Sf_Rv#!r{`FSVhJ%zK}IGFVMZpqI^Pdv}+^LcwX!Dr$%M z7{TU5gH~5^naSU4<6t!3qzccncMx5FP9ulSQ*%~>Mw~>rP}`TbZX~Oq%pOS+z*MYP1-okzLYwbA*4wHO*E zbP>YE6E5@kXdICpYGegrPE}Qya{qr)Kr_#l)Y0QjE&ktxf$RIQl56nR literal 0 HcmV?d00001 diff --git a/fs/pilotage/piloge-fi.md b/fs/pilotage/piloge-fi.md index 955d0a5..3cf88dd 100644 --- a/fs/pilotage/piloge-fi.md +++ b/fs/pilotage/piloge-fi.md @@ -4,7 +4,7 @@ # Quels sont les fournisseurs d'identités disponible sur FranceConnect+ ? -La liste des fournisseurs d'identité est disponible sur le site internet de [FranceConnect+](https://franceconnect.gouv.fr/france-connect-plus). Il s'agit exclusivement de fournisseurs d'identité qualifié par l'ANSSI pour les niveau de garantie substantiel et élevé. +La liste des fournisseurs d'identité est disponible sur le site internet de [FranceConnect+](https://franceconnect.gouv.fr/france-connect-plus). Il s'agit exclusivement de fournisseurs d'identité qualifié par l'ANSSI pour les niveaux de garantie substantiel et élevé. En complément des fournisseurs d'identité, FranceConnect+ propose également une connection à la passerelle européenne eIDAS, permettant l'accès à votre fournisseu de service à des citoyens des autres états membres européens. Ceci est une obligation pour les fournisseurs de service publics utilisant FranceConnect+ et optionnel pour les fournisseurs de service privés. diff --git a/fs/pilotage/pilotage-differences-fc-fc+.md b/fs/pilotage/pilotage-differences-fc-fc+.md index f434832..02c04b4 100644 --- a/fs/pilotage/pilotage-differences-fc-fc+.md +++ b/fs/pilotage/pilotage-differences-fc-fc+.md @@ -1,4 +1,4 @@ -[Documentation Fournisseur](../README.md) > [Je veux devenir Fournisseur de Service](../README.md#je-veux-devenir-fournisseur-de-service) > Quelles sont les différences entre FranceConnect et FranceConnect+ ? +[Documentation Fournisseur](../README.md) > [Je veux devenir Fournisseur de Service](README.md) > Quelles sont les différences entre FranceConnect et FranceConnect+ ? --- diff --git a/fs/pilotage/pilotage-etapes.md b/fs/pilotage/pilotage-etapes.md index b2fe477..f6edba3 100644 --- a/fs/pilotage/pilotage-etapes.md +++ b/fs/pilotage/pilotage-etapes.md @@ -1,4 +1,4 @@ -[Documentation Fournisseur](../README.md) > [Je veux devenir Fournisseur de Service](../README.md#je-veux-devenir-fournisseur-de-service) > Quelles sont les étapes pour devenir Fournisseur de Service ? +[Documentation Fournisseur](../README.md) > [Je veux devenir Fournisseur de Service](README.md) > Quelles sont les étapes pour devenir Fournisseur de Service ? --- # Quelles sont les étapes pour devenir Fournisseur de Service ? @@ -35,3 +35,5 @@ Si votre implémentation est validée par notre équipe, vous recevez vos secret Voir aussi : - [Quels sont les acteurs à impliquer dans l'intégration de FranceConnect+ ?](pilotage-demarches-acteurs.md) - [Comment effectuer ma demande d'habilitation pour FranceConnect+ ?](../projet/projet-datapass.md) +- [Quelles sont les différences entre FranceConnect et FranceConnect+ ?](./pilotage-differences-fc-fc%2B.md) +- [Je suis déjà Fournisseur de Service pour FranceConnect, que dois je faire en plus pour devenir Fournisseur de Service pour FranceConnect+ ?](./pilotage-integrer-fc%2B-apres-fc.md) \ No newline at end of file diff --git a/fs/pilotage/pilotage-facturation.md b/fs/pilotage/pilotage-facturation.md index 01ad473..0afeba5 100644 --- a/fs/pilotage/pilotage-facturation.md +++ b/fs/pilotage/pilotage-facturation.md @@ -1,4 +1,4 @@ -[Documentation Fournisseur](../README.md) > [Je veux devenir Fournisseur de Service](../README.md#je-veux-devenir-fournisseur-de-service) > L'usage de FranceConnect+ est-il payant? +[Documentation Fournisseur](../README.md) > [Je veux devenir Fournisseur de Service](README.md) > L'usage de FranceConnect+ est-il payant? --- diff --git a/fs/pilotage/pilotage-integrer-fc+-apres-fc.md b/fs/pilotage/pilotage-integrer-fc+-apres-fc.md index 591b7b4..9e43474 100644 --- a/fs/pilotage/pilotage-integrer-fc+-apres-fc.md +++ b/fs/pilotage/pilotage-integrer-fc+-apres-fc.md @@ -1,4 +1,4 @@ -[Documentation Fournisseur](../README.md) > [Je veux devenir Fournisseur de Service](../README.md#je-veux-devenir-fournisseur-de-service) > Je suis déjà Fournisseur de Service pour FranceConnect, que dois je faire en plus pour devenir Fournisseur de Service pour FranceConnect+ ? +[Documentation Fournisseur](../README.md) > [Je veux devenir Fournisseur de Service](README.md) > Je suis déjà Fournisseur de Service pour FranceConnect, que dois je faire en plus pour devenir Fournisseur de Service pour FranceConnect+ ? --- diff --git a/fs/projet/README.md b/fs/projet/README.md new file mode 100644 index 0000000..1a8519b --- /dev/null +++ b/fs/projet/README.md @@ -0,0 +1,59 @@ +# Je gère un projet d'intégration de FranceConnect+ + +Vous avez lancé un projet pour devenir FranceConnect+ et vous souhaiter connaitre les différentes problématique d'intégration de FranceConnect+, voici les questions à vous poser : + +### Comment effectuer ma demande d'habilitation pour FranceConnect+ ? + +Pour pouvoir utiliser FranceConnect+, il est nécessaire de faire une demande d'habilitation au travers de l'outil [datapass]([datapass](https://datapass.api.gouv.fr/franceconnect/)) mis à disposition par la DINUM. + +[Plus d'informations](projet-datapass.md) + + +### Comment puis-je réaliser des tests de FranceConnect+ avant de soumettre ma demande d'habilitation ? + +Contrairement à la plateforme FranceConnect, il est nécessaire d'avoir sa demande d'habilitation (datapass) validée avant de pouvoir utiliser la plateforme FranceConnect+. + +[Plus d'informations](projet-tests-sans-datapass.md) + +### Quel est l'écosystème de FranceConnect+ ? + +Il existe différents types d'acteur dans l'ecosystème de FranceConnect+ : +- les fournisseurs d'identité +- les fournisseurs de services +- les fournisseurs de données + +[Plus d'informations](projet/projet-ecosysteme-fc+.md) + + +### Quelles sont les données que je peux récupérer par FranceConnect+ sur mes usagers ? + +FranceConnect+ permet de récupérer les données suivantes de mes usagers : + +- Nom de naissance; +- Prénoms +- Sexe +- Date de naissance +- Code géographique INSEE de la ville de naissance +- Code géographique INSEE du pays de naissance + +[Plus d'informations](projet-donnees-fc+.md) + + +### Qu'est ce qu'eIDAS et quels sont les niveaux de garantie de FranceConnect+ ? + +Le règlement européen eIDAS encadre notamment les moyens d'identifications électronique. Il défini notamment des niveaux de garanties sur les identités numériques qui peut être utiliser pour authentifier et identifier les usagers. + +Les trois niveaux de garantie définis dans ce règlement sont les suivants : +- **Faible** : à ce niveau, l’objectif est simplement de réduire le risque d’utilisation abusive ou d’altération de l’identité ; +- **Substantiel** : à ce niveau, l’objectif est de réduire substantiellement le risque d’utilisation abusive ou d’altération de l’identité ; +- **Élevé** : à ce niveau, l’objectif est d’empêcher l’utilisation abusive ou l’altération de l’identité. + + +[Plus d'informations](./projet-niveau-eidas.md) + +### Comment donner accès à mon service à des usagers des autres états membres ? + +FranceConnect+ propose une passerelle qui permet aux usagers des autres états membres de s'authentifier et de s'identifier pour acceder à votre service. + +[Plus d'informations](./projet-fonctionnement-noeud-eidas.md) + diff --git a/fs/projet/projet-datapass.md b/fs/projet/projet-datapass.md index 590e79f..543bb5b 100644 --- a/fs/projet/projet-datapass.md +++ b/fs/projet/projet-datapass.md @@ -1,10 +1,10 @@ -[Documentation Fournisseur de Service](../README.md) > [Je gère un projet d'intégration de FranceConnect+](../README.md#je-veux-devenir-fournisseur-de-service) > Comment effectuer ma demande d'habilitation pour FranceConnect+ ? +[Documentation Fournisseur de Service](../README.md) > [Je gère un projet d'intégration de FranceConnect+](README.md) > Comment effectuer ma demande d'habilitation pour FranceConnect+ ? --- # Comment effectuer ma demande d'habilitation pour FranceConnect+ ? -Pour pouvoir utiliser FranceConnect+, il est nécessaire de faire une demande d'habilitation au travers de l'outils [datapass](https://datapass.api.gouv.fr/franceconnect/) mis à disposition par la DINUM. +Pour pouvoir utiliser FranceConnect+, il est nécessaire de faire une demande d'habilitation au travers de l'outil [datapass](https://datapass.api.gouv.fr/franceconnect/) mis à disposition par la DINUM. Vous aurez besoin de renseigners les informations suivantes : diff --git a/fs/projet/projet-donnees-fc+.md b/fs/projet/projet-donnees-fc+.md index c9326fd..a4c2f8c 100644 --- a/fs/projet/projet-donnees-fc+.md +++ b/fs/projet/projet-donnees-fc+.md @@ -1,4 +1,4 @@ -[Documentation Fournisseur de Service](../README.md) > [Je gère un projet d'intégration de FranceConnect+](../README.md#je-veux-devenir-fournisseur-de-service) > Quelles sont les données que je peux récupérer par FranceConnect+ sur mes usagers ? +[Documentation Fournisseur de Service](../README.md) > [Je gère un projet d'intégration de FranceConnect+](README.md) > Quelles sont les données que je peux récupérer par FranceConnect+ sur mes usagers ? --- diff --git a/fs/projet/projet-ecosysteme-fc+.md b/fs/projet/projet-ecosysteme-fc+.md index e69de29..5916594 100644 --- a/fs/projet/projet-ecosysteme-fc+.md +++ b/fs/projet/projet-ecosysteme-fc+.md @@ -0,0 +1,13 @@ +[Documentation Fournisseur de Service](../README.md) > [Je gère un projet d'intégration de FranceConnect+](README.md) > Quel est l'écosystème de FranceConnect+ ? + + +--- + +# Quel est l'écosystème de FranceConnect+ ? + + +--- + +Voir aussi : + +- []() \ No newline at end of file diff --git a/fs/projet/projet-fonctionnement-noeud-eidas.md b/fs/projet/projet-fonctionnement-noeud-eidas.md index 01af2a8..7ba022d 100644 --- a/fs/projet/projet-fonctionnement-noeud-eidas.md +++ b/fs/projet/projet-fonctionnement-noeud-eidas.md @@ -1,10 +1,49 @@ +[Documentation Fournisseur de Service](../README.md) > [Je gère un projet d'intégration de FranceConnect+](README.md) > Comment donner accès à mon service à des usagers des autres états membres ? +--- -## Quel est l'objectif du noeud d'intéropérabilité eIDAS +# Comment donner accès à mon service à des usagers des autres états membres ? + +Vous souhaitez donner accès à votre service à des usagers des autres états membre. Cela est possible en utilisant FranceConnect+ et le noeud d'interopérabilité eIDAS français. + + +## Quel est l'objectif du noeud d'interopérabilité eIDAS ? Dans le cadre du règlement eIDAS, chaque état membre met à disposition un noeud d'intéropérabilité eIDAS qui permet à tout citoyen européen d'accéder à des fournisseurs de service d'un autre état membre en utilisant un schéma d'identification d'un autre état membre. Au niveau de la France, le noeud d'intéropérabilité est opéré par la DINUM au même titre que FranceConnect+. -### Comment un fournisseur de service peut utiliser - +Il est donc possible pour des fournisseurs de service, d'authentifier et d'identifier les usagers des autres états membres avec les fournisseurs d'identités mis à disposition par leur état membre. + +Ainsi, les usagers des autres états membres peuvent accéder à votre service en utilisant le fournisseur d'identité qu'ils utilisent habituellement dans leur pays. + +## Quels sont les niveaux de garantie accessible via les schémas d'identification des autres états membre ? + +Les niveaux de garanties utilisables via les schémas d'idenitification des autres états membre sont les niveaux substantiels et élevés. Il n'est pas possible de demandés ou d'obtenir des identités de niveau de garantie faible via les schémas d'identification des autres états membres. + + +### Comment un fournisseur de service peut utiliser le noeud d'interopérabilité eIDAS français ? + +L'accès au noeud d'interoperabilité se fait au travers de FranceConnect+. Pour y avoir accès, il est nécessaire d'en faire la demande auprès de l'équipe FranceConnect. Par défaut, celui-ci n'est pas disponible. + +### Quel est le parcours d'un usager d'un autre état membre pour accéder à mon service ? + +Le point de départ est le même que pour les autres usagers, il est nécessaire de cliquer sur le bouton FranceConnect+ disponible sur votre service. + +Une fois sur la page de sélection du fournisseur d'identité, un bouton *Sign in with a digital identity from another european country* permet à l'usager d'indiquer qu'il souhaite utiliser le schéma d'identification d'un autre état membre. + + + +### Les données d'identités d'un usager d'un autre état membre sont elles les mêmes que celles que je récupère habituellement ? + +... + + +--- + +Voir aussi : + +* [Qu'est ce qu'eIDAS et quels sont les niveaux de garantie de FranceConnect+ ?](./projet-niveau-eidas.md) + + + diff --git a/fs/projet/projet-niveau-eidas.md b/fs/projet/projet-niveau-eidas.md index 647fbca..17f2585 100644 --- a/fs/projet/projet-niveau-eidas.md +++ b/fs/projet/projet-niveau-eidas.md @@ -1,4 +1,4 @@ -[Documentation Fournisseur de Service](../README.md) > [Je gère un projet d'intégration de FranceConnect+](../README.md#je-g%C3%A8re-un-projet-dint%C3%A9gration-de-franceconnect) > eIDAS +[Documentation Fournisseur de Service](../README.md) > [Je gère un projet d'intégration de FranceConnect+](README.md) > Qu'est ce qu'eIDAS et quels sont les niveaux de garantie de FranceConnect+ ? --- @@ -48,29 +48,9 @@ Le tableau ci-dessous récapitule les niveaux supportés par les deux plateforme | substantiel | Non | Oui |  | élevé | Non | A venir | -## Schéma d'identification européen et passelle d'interopérabilité -Le règlement eIDAS demande aux états membre de se doter d'un schéma d'identification et de le rendre interopérable avec les aux états membre européen. - -Le schéma d'identification est le mécanisme d'un pays qui permet à un usager de s'authentifier et de s'identifier. - -L'objectif est de permettre à un usager d'un état membre d'accéder aux service d'un autre état membre en utilisant le schéma d'identification qu'il utilise habituellement. Cela peut permettre, par exemple, à un usager français d'accéder au service des impots belges. - -Actuellement, la France ne dispose que d'un seul schéma d'identification utilisable par les autres états membre, il s'agit de FranceConnect+ combiné avec L'identité Numérique La Poste. Cependant, cela ne concerne que les services des autres états membres. - -Il est possible pour un fournisseur de service d'utiliser les schémas d'identification d'un autre état membre. - -## Quels sont les niveaux de garantie accessible via les schémas d'identification des autres états membre ? - -Les niveaux de garanties utilisables via les schémas d'idenitification des autres états membre sont les niveaux substantiels et élevés. Il n'est pas possible de demandés ou d'obtenir des identités de niveau de garantie faible via les schémas d'identification des autres états membres. - -## Comment utiliser les schémas d'identification des autres états membres ? - -L'accès aux schémas d'identification des autres états membres se fait exclusivement via la plateforme FranceConnect+. C'est la DINUM, qui opère FranceConnect et FranceConnect+, qui est chargé de faire le lien entre la plateforme FranceConnect+ et les schémas d'identification des autres états membre. - -### Comment avoir accès aux autres schémas d'identifications européens pour mon fournisseur de service ? - -### Comment l'usager d'un autre état membre doit il faire pour accéder à un autre service +--- +Voir aussi : ---- \ No newline at end of file +* [Comment donner accès à mon service à des usagers des autres états membres ?](./projet-fonctionnement-noeud-eidas.md) \ No newline at end of file diff --git a/fs/projet/projet-tests-sans-datapass.md b/fs/projet/projet-tests-sans-datapass.md index 502abe9..8361a9f 100644 --- a/fs/projet/projet-tests-sans-datapass.md +++ b/fs/projet/projet-tests-sans-datapass.md @@ -1,4 +1,4 @@ -[Documentation Fournisseur de Service](../README.md) > [Comment puis-je réaliser des tests de FranceConnect+ avant de soumettre ma demande d'habilitation ?](../README.md#je-g%C3%A8re-un-projet-dint%C3%A9gration-de-franceconnect) > eIDAS +[Documentation Fournisseur de Service](../README.md) > [Comment puis-je réaliser des tests de FranceConnect+ avant de soumettre ma demande d'habilitation ?](README.md) > Comment puis-je réaliser des tests de FranceConnect+ avant de soumettre ma demande d'habilitation ? --- From f8599c92ee3303afe6db87e0e73d83adb076eb67 Mon Sep 17 00:00:00 2001 From: Benjamin Ratti Date: Thu, 23 Feb 2023 18:38:06 +0100 Subject: [PATCH 37/37] doc(fs) : correction lien dans la section projet --- fs/projet/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fs/projet/README.md b/fs/projet/README.md index 1a8519b..1b85f6a 100644 --- a/fs/projet/README.md +++ b/fs/projet/README.md @@ -6,14 +6,14 @@ Vous avez lancé un projet pour devenir FranceConnect+ et vous souhaiter connait Pour pouvoir utiliser FranceConnect+, il est nécessaire de faire une demande d'habilitation au travers de l'outil [datapass]([datapass](https://datapass.api.gouv.fr/franceconnect/)) mis à disposition par la DINUM. -[Plus d'informations](projet-datapass.md) +[Plus d'informations](./projet-datapass.md) ### Comment puis-je réaliser des tests de FranceConnect+ avant de soumettre ma demande d'habilitation ? Contrairement à la plateforme FranceConnect, il est nécessaire d'avoir sa demande d'habilitation (datapass) validée avant de pouvoir utiliser la plateforme FranceConnect+. -[Plus d'informations](projet-tests-sans-datapass.md) +[Plus d'informations](./projet-tests-sans-datapass.md) ### Quel est l'écosystème de FranceConnect+ ? @@ -22,7 +22,7 @@ Il existe différents types d'acteur dans l'ecosystème de FranceConnect+ : - les fournisseurs de services - les fournisseurs de données -[Plus d'informations](projet/projet-ecosysteme-fc+.md) +[Plus d'informations](./projet-ecosysteme-fc+.md) ### Quelles sont les données que je peux récupérer par FranceConnect+ sur mes usagers ?