Skip to content

Commit

Permalink
Merge branch 'master' into add-all-target-acr
Browse files Browse the repository at this point in the history
  • Loading branch information
douglasduteil authored Feb 10, 2025
2 parents 219f0bf + 2e9d9b8 commit 81680e3
Show file tree
Hide file tree
Showing 156 changed files with 3,389 additions and 2,378 deletions.
1 change: 1 addition & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,4 @@ updates:
- dependencies
schedule:
interval: "weekly"
versioning-strategy: increase
36 changes: 36 additions & 0 deletions .github/labeler.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Global

":construction_worker: CI":
- changed-files:
- any-glob-to-any-file: ".github/**"
":memo: documentation":
- changed-files:
- any-glob-to-any-file: "**/*.md"
":traffic_light: e2e":
- changed-files:
- any-glob-to-any-file: "cypress/**/*"
":file_cabinet: e2e":
- changed-files:
- any-glob-to-any-file: "migrations/**/*"
":test_tube: unit test":
- changed-files:
- any-glob-to-any-file: "test/**/*"
- any-glob-to-any-file: "**/*.test.ts"

# Scopes

"scope: core":
- changed-files:
- any-glob-to-any-file: "packages/core/**/*"
"scope: crisp":
- changed-files:
- any-glob-to-any-file: "packages/crisp/**/*"
"scope: email":
- changed-files:
- any-glob-to-any-file: "packages/email/**/*"
"scope: identite":
- changed-files:
- any-glob-to-any-file: "packages/identite/**/*"
"scope: insee":
- changed-files:
- any-glob-to-any-file: "packages/insee/**/*"
4 changes: 2 additions & 2 deletions .github/workflows/end-to-end.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@ jobs:
- signin_with_totp
- signup_entreprise_unipersonnelle
- update_personal_information
- update_totp_application
runs-on: ubuntu-22.04
services:
standard-client:
Expand Down Expand Up @@ -104,6 +103,7 @@ jobs:

- run: docker compose up --build --detach maildev

- run: corepack enable
- uses: actions/setup-node@v4
with:
cache: "npm"
Expand All @@ -114,7 +114,7 @@ jobs:
- run: npm run fixtures:load-ci -- cypress/e2e/${{ matrix.e2e_test }}/fixtures.sql
- run: npm run update-organization-info -- 500
- name: Cypress run
uses: cypress-io/[email protected].7
uses: cypress-io/[email protected].10
with:
wait-on: ${{ env.HOST }}/users/start-sign-in
build: npm run build:assets
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/fixtures.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ jobs:
- 5432:5432
steps:
- uses: actions/checkout@v4
- run: corepack enable
- uses: actions/setup-node@v4
with:
cache: "npm"
Expand Down
13 changes: 13 additions & 0 deletions .github/workflows/labeler.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
name: 🔖 Pull Request Labeler

on:
- pull_request_target

jobs:
labeler:
permissions:
contents: read
pull-requests: write
runs-on: ubuntu-latest
steps:
- uses: actions/labeler@8558fd74291d67161a8a78ce36a881fa63b766a9 # v5
1 change: 1 addition & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ jobs:
steps:
- uses: actions/checkout@v4

- run: corepack enable
- uses: actions/setup-node@v4
with:
cache: "npm"
Expand Down
8 changes: 8 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ jobs:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- run: corepack enable
- uses: actions/setup-node@v4
with:
cache: "npm"
Expand All @@ -25,5 +26,12 @@ jobs:
- run: npm run build:workspaces
- run: npm run test:lint
- run: npm run test:workspaces
env:
CRISP_BASE_URL: https://api.crisp.chat
CRISP_IDENTIFIER: ${{ secrets.CRISP_IDENTIFIER }}
CRISP_KEY: ${{ secrets.CRISP_KEY }}
CRISP_PLUGIN_URN: ${{ secrets.CRISP_PLUGIN_URN }}
CRISP_USER_NICKNAME: ${{ secrets.CRISP_USER_NICKNAME }}
CRISP_WEBSITE_ID: ${{ secrets.CRISP_WEBSITE_ID }}
- run: npm run test:type-check
- run: npm run test:unit
22 changes: 16 additions & 6 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,34 +1,44 @@
FROM node:22-slim AS base
RUN corepack enable

RUN --mount=type=bind,source=package.json,target=package.json \
corepack prepare --activate

WORKDIR /app

FROM base AS prod-deps
RUN --mount=type=bind,source=package.json,target=package.json \
--mount=type=bind,source=package-lock.json,target=package-lock.json \
--mount=type=bind,source=packages/core/package.json,target=packages/core/package.json \
--mount=type=bind,source=packages/crisp/package.json,target=packages/crisp/package.json \
--mount=type=bind,source=packages/debounce/package.json,target=packages/debounce/package.json \
--mount=type=bind,source=packages/devtools/typescript/package.json,target=packages/devtools/typescript/package.json \
--mount=type=bind,source=packages/email/package.json,target=packages/email/package.json \
--mount=type=bind,source=packages/identite/package.json,target=packages/identite/package.json \
--mount=type=bind,source=packages/insee/package.json,target=packages/insee/package.json \
--mount=type=cache,target=/root/.npm \
npm ci --omit=dev
--mount=type=cache,sharing=locked,target=/root/.npm \
corepack npm ci --omit=dev

FROM base AS build
ENV CYPRESS_INSTALL_BINARY=0
RUN --mount=type=bind,source=package.json,target=package.json \
--mount=type=bind,source=package-lock.json,target=package-lock.json \
--mount=type=bind,source=packages/core/package.json,target=packages/core/package.json \
--mount=type=bind,source=packages/crisp/package.json,target=packages/crisp/package.json \
--mount=type=bind,source=packages/debounce/package.json,target=packages/debounce/package.json \
--mount=type=bind,source=packages/devtools/typescript/package.json,target=packages/devtools/typescript/package.json \
--mount=type=bind,source=packages/email/package.json,target=packages/email/package.json \
--mount=type=bind,source=packages/identite/package.json,target=packages/identite/package.json \
--mount=type=bind,source=packages/insee/package.json,target=packages/insee/package.json \
--mount=type=cache,target=/root/.npm \
npm ci
--mount=type=cache,sharing=locked,target=/root/.npm \
corepack npm ci
COPY tsconfig.json vite.config.mjs ./
COPY assets/ ./assets/
COPY public/ ./public/
COPY src/ ./src/
COPY packages/ ./packages/
COPY package*.json ./
RUN npx run-s build:*
RUN corepack npx run-s build:*

FROM base
COPY package.json ./
Expand All @@ -37,4 +47,4 @@ COPY --from=build /app/dist /app/dist
COPY --from=build /app/src /app/src
COPY --from=build /app/packages /app/packages

CMD [ "npm", "start" ]
CMD [ "corepack", "npm", "start" ]
30 changes: 15 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# 🔑 ProConnect - Identité (ex-MonComptePro)
# 🔑 ProConnect - Identité

ProConnect Identité est un fournisseur d'identité "OpenId Connect" géré par la DINUM.

Expand All @@ -12,7 +12,7 @@ Pour vous intégrer la fédération ProConnect, merci de vous référer à [notr

## 1. 🗺️ Tester le parcours

Pour tester le parcours de connexion ProConnect Identité, vous pouvez utiliser notre plateforme dédiée : https://test.moncomptepro.beta.gouv.fr/.
Pour tester le parcours de connexion ProConnect Identité, vous pouvez utiliser notre plateforme dédiée : https://test.identite.proconnect.gouv.fr/.

Vous pouvez utiliser le compte de test suivant :

Expand Down Expand Up @@ -40,8 +40,8 @@ Afin d'effectuer les développements sur votre service en ligne, nous fournisson

Afin de configurer votre module ou votre client OpenId Connect, vous trouverez ci-dessous les paramètres de configuration spécifiques à ProConnect Identité :

- paramètres de configuration de l’instance de test : https://app-sandbox.moncomptepro.beta.gouv.fr/.well-known/openid-configuration
- paramètres de configuration de l’instance de production : https://app.moncomptepro.beta.gouv.fr/.well-known/openid-configuration
- paramètres de configuration de l’instance de test : https://identite-sandbox.proconnect.gouv.fr/.well-known/openid-configuration
- paramètres de configuration de l’instance de production : https://identite.proconnect.gouv.fr/.well-known/openid-configuration
- Les périmètres de données (scope) disponibles sont les suivants :
- `openid` (données : sub)
- `email` (données : email, email_verified)
Expand Down Expand Up @@ -78,11 +78,11 @@ si votre utilisateur utilise un poste partagé, une autre personne pourrait util
les informations de l'utilisateur initial dans votre service. Il convient d'effectuer une déconnexion simultanée sur
ProConnect Identité et sur votre service.

Vous pouvez tester la cinématique de déconnexion via le lien suivant : https://test.moncomptepro.beta.gouv.fr/#logout
Vous pouvez tester la cinématique de déconnexion via le lien suivant : https://test.identite.proconnect.gouv.fr/#logout

Afin d'effectuer une déconnexion simultanée, il faut rediriger l'utilisateur vers la route de déconnexion de ProConnect Identité :

https://app-sandbox.moncomptepro.beta.gouv.fr/oauth/logout?post_logout_redirect_uri=https%3A%2F%2Ftest.moncomptepro.beta.gouv.fr%2F&client_id=client_id
https://identite-sandbox.proconnect.gouv.fr/oauth/logout?post_logout_redirect_uri=https%3A%2F%2Ftest.identite.proconnect.gouv.fr%2F&client_id=client_id

### 2.4. 🏛️ Permettre à l'utilisateur de sélectionner une autre organisation

Expand All @@ -92,11 +92,11 @@ Au moment de se connecter à votre service, ProConnect Identité demande à l'ut
Si vous souhaitez donner la possibilité à l’utilisateur de représenter une autre organisation sans qu’il ait besoin de
se reconnecter, vous pouvez demander l’interface de sélection d’organisation à ProConnect Identité.

Vous pouvez tester la cinématique via le lien suivant : https://test.moncomptepro.beta.gouv.fr/#select-organization
Vous pouvez tester la cinématique via le lien suivant : https://test.identite.proconnect.gouv.fr/#select-organization

Pour ce faire, vous pouvez rediriger l'utilisateur sur la route authorize avec le paramètre `prompt=select_organization` comme suit :

https://app-sandbox.moncomptepro.beta.gouv.fr/oauth/authorize?client_id=client_id&scope=openid%20email%20profile%20organization&response_type=code&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Flogin-callback&prompt=select_organization
https://identite-sandbox.proconnect.gouv.fr/oauth/authorize?client_id=client_id&scope=openid%20email%20profile%20organization&response_type=code&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Flogin-callback&prompt=select_organization

### 2.5. 🔎 Permettre à l'utilisateur de mettre à jour ses informations

Expand All @@ -105,22 +105,22 @@ Les utilisateurs peuvent avoir commis des erreurs lors de la constitution de leu
Si vous souhaitez donner l’opportunité à l’utilisateur de mettre à jour ses informations utilisateurs sans qu’il ait besoin
de se reconnecter, vous pouvez demander l’interface de mise à jour des informations personnelles à ProConnect Identité.

Vous pouvez tester la cinématique via le lien suivant : https://test.moncomptepro.beta.gouv.fr/#update-userinfo
Vous pouvez tester la cinématique via le lien suivant : https://test.identite.proconnect.gouv.fr/#update-userinfo

Pour ce faire, vous pouvez rediriger l'utilisateur sur la route authorize avec le paramètre `prompt=update_userinfo` comme suit :

https://app-sandbox.moncomptepro.beta.gouv.fr/oauth/authorize?client_id=client_id&scope=openid%20email%20profile%20organization&response_type=code&redirect_uri=https%3A%2F%2Ftest.moncomptepro.beta.gouv.fr%2Flogin-callback&prompt=update_userinfo
https://identite-sandbox.proconnect.gouv.fr/oauth/authorize?client_id=client_id&scope=openid%20email%20profile%20organization&response_type=code&redirect_uri=https%3A%2F%2Ftest.identite.proconnect.gouv.fr%2Flogin-callback&prompt=update_userinfo

### 2.6. 🚪 Exiger une ré-authentification

Certaines fonctionnalités sensibles requièrent d’authentifier l'utilisateur à nouveau pour réduire les risques
d’usurpations d’identités liés à la durée de session de ProConnect Identité.

Vous pouvez tester la cinématique via le lien suivant : https://test.moncomptepro.beta.gouv.fr/#force-login
Vous pouvez tester la cinématique via le lien suivant : https://test.identite.proconnect.gouv.fr/#force-login

Pour ce faire, vous devez passer les paramètres `prompt=login` et `claims={"id_token":{"auth_time":{"essential":true}}}` comme suit :

https://app-sandbox.moncomptepro.beta.gouv.fr/oauth/authorize?client_id=client_id&scope=openid%20email%20profile%20organization&response_type=code&redirect_uri=https%3A%2F%2Ftest.moncomptepro.beta.gouv.fr%2Flogin-callback&claims=%7B%22id_token%22%3A%7B%22auth_time%22%3A%7B%22essential%22%3Atrue%7D%7D%7D&prompt=login
https://identite-sandbox.proconnect.gouv.fr/oauth/authorize?client_id=client_id&scope=openid%20email%20profile%20organization&response_type=code&redirect_uri=https%3A%2F%2Ftest.identite.proconnect.gouv.fr%2Flogin-callback&claims=%7B%22id_token%22%3A%7B%22auth_time%22%3A%7B%22essential%22%3Atrue%7D%7D%7D&prompt=login

Afin de s’assurer que l’utilisateur s’est bien ré-authentifié, il est impératif que votre service vérifie la valeur `auth_time`
retournée dans l’ID token. Si la date est supérieure à 5 minutes, l’utilisateur ne s'est pas reconnecté récemment et vous
Expand All @@ -134,7 +134,7 @@ il est possible de récupérer via le claim `amr` la liste des méthodes d’aut
Par défaut ce claim `amr` n’est pas retourné dans l’IdToken, il doit être demandé explicitement.
Pour ce faire, vous devez passer les paramètres `prompt=login` et `claims={"id_token":{"auth_time":{"essential":true}}}` comme suit :

https://app-sandbox.moncomptepro.beta.gouv.fr/oauth/authorize?client_id=client_id&scope=openid%20email%20profile%20organization&response_type=code&redirect_uri=https%3A%2F%2Ftest.moncomptepro.beta.gouv.fr%2Flogin-callback&claims=%7B%22id_token%22%3A%7B%22amr%22%3A%7B%22essential%22%3Atrue%7D%7D%7D
https://identite-sandbox.proconnect.gouv.fr/oauth/authorize?client_id=client_id&scope=openid%20email%20profile%20organization&response_type=code&redirect_uri=https%3A%2F%2Ftest.identite.proconnect.gouv.fr%2Flogin-callback&claims=%7B%22id_token%22%3A%7B%22amr%22%3A%7B%22essential%22%3Atrue%7D%7D%7D

ProConnect Identité peut renvoyer une combinaison des valeurs suivantes :

Expand All @@ -153,11 +153,11 @@ Vous trouverez de plus amples informations sur la [documentation de FranceConnec
Certaines fonctionnalités sensibles requièrent une authentification à double facteur pour réduire les risques
d’usurpations d’identités liés aux attaques par _phishing_ par exemple.

Vous pouvez tester la cinématique via le lien suivant : https://test.moncomptepro.beta.gouv.fr/#force-2fa
Vous pouvez tester la cinématique via le lien suivant : https://test.identite.proconnect.gouv.fr/#force-2fa

Pour ce faire, vous devez passer les paramètres `claims={"id_token":{"acr":{"essential":true,value:"https://proconnect.gouv.fr/assurance/consistency-checked-2fa"}}}` comme suit :

https://app-sandbox.moncomptepro.beta.gouv.fr/oauth/authorize?client_id=client_id&scope=openid%20email%20profile%20organization&response_type=code&redirect_uri=https%3A%2F%2Ftest.moncomptepro.beta.gouv.fr%2Flogin-callback&claims=%7B%22id_token%22%3A%7B%22acr%22%3A%7B%22essential%22%3Atrue%2C%22value%22%3A%22https%3A%2F%2Frefeds.org%2Fprofile%2Fmfa%22%7D%7D%7D
https://identite-sandbox.proconnect.gouv.fr/oauth/authorize?client_id=client_id&scope=openid%20email%20profile%20organization&response_type=code&redirect_uri=https%3A%2F%2Ftest.identite.proconnect.gouv.fr%2Flogin-callback&claims=%7B%22id_token%22%3A%7B%22acr%22%3A%7B%22essential%22%3Atrue%2C%22value%22%3A%22https%3A%2F%2Frefeds.org%2Fprofile%2Fmfa%22%7D%7D%7D

Les valeurs `acr` utilisées par ProConnect Identité sont les suivantes :

Expand Down
47 changes: 18 additions & 29 deletions assets/css/imports/custom.css
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#email-badge-lowercase {
text-transform: lowercase;
.email-badge-lowercase {
text-transform: lowercase !important;
}

.inline-form {
Expand All @@ -14,41 +14,30 @@
white-space: break-spaces;
}

/* magic link icon */
#magic-link-icon-inline {
padding: 0 1.5rem;
.border-shadow {
border-radius: 4px;
box-shadow: 0 3px 7px rgba(0, 0, 0, 0.1);
}

#magic-link-icon-block {
text-align: center;
margin: 3rem 0;
.blue-france {
color: #00008f !important;
}

#magic-link-icon-block > img {
height: 46px;
.grey-background {
background-color: #f6f6f6 !important;
}

/* proconnect-header */
.header {
display: flex;
align-items: center;
justify-content: center;
/* DELETE WHEN HEADER FROM DSFR WILL REPLACE MCP HEADER */
border-bottom: solid 1px #ddd;
/* DELETE WHEN WE'LL FOUND BEST SOLUTION TO MASK GREY */
background-color: white;
.centered-content {
justify-content: center !important;
}

.header > img {
height: 4.5rem;
margin: 2.5rem 0 1.5rem;
}

@media all and (max-width: 576px) {
.header > img {
height: 3.5rem;
margin: 1.5rem 0 0.5rem;
}
.disabled-button {
background-color: #e0e0e0 !important;
color: #a0a0a0 !important;
cursor: not-allowed;
border: 1px solid #d0d0d0;
opacity: 0.7;
pointer-events: none;
}

/* display a loading bar on page load */
Expand Down
1 change: 0 additions & 1 deletion assets/css/imports/layout.css
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,6 @@ main {

.card-button-container {
display: flex;
justify-content: space-between;
align-items: center;
gap: 1.5rem;
width: 100%;
Expand Down
23 changes: 23 additions & 0 deletions assets/js/authent-app-installed-on-phone.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
const initializeCheckboxOTP = () => {
const checkbox = document.getElementById("is-authenticator-app-installed");
const continueLink = document.getElementById("continue-button");

if (!checkbox || !continueLink) return;

const updateLinkState = () => {
if (checkbox.checked) {
continueLink.removeAttribute("aria-disabled");
continueLink.classList.remove("disabled-button");
} else {
continueLink.setAttribute("aria-disabled", "true");
continueLink.classList.add("disabled-button");
}
};

updateLinkState();

checkbox.addEventListener("change", updateLinkState);
};

document.addEventListener("DOMContentLoaded", initializeCheckboxOTP);
window.addEventListener("pageshow", initializeCheckboxOTP);
6 changes: 2 additions & 4 deletions assets/js/fetch-organization-info.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,7 @@ document.addEventListener(
var organizationAlertContentElement =
organizationAlertElement.querySelector(".alert--content");
var siretSelectorElement = document.getElementById("siret-selector");
var submitElement = document.querySelector(
'.card-button-container button[type="submit"]',
);
var submitElement = document.querySelector('button[type="submit"]');

function clearOrganizationInfo() {
organizationInfoElement.style.display = "none";
Expand Down Expand Up @@ -92,7 +90,7 @@ document.addEventListener(
organizationAlertContentElement.innerHTML =
"Erreur inconnue lors de la récupération des informations de cet établissement. " +
"Merci de réessayer ultérieurement. " +
"Vous pouvez également nous signaler cette erreur par mail à [email protected].gouv.fr.";
"Vous pouvez également nous signaler cette erreur par mail à support+identite@proconnect.gouv.fr.";
}
if (xmlhttp.status !== 200) {
submitElement.removeAttribute("aria-label");
Expand Down
Loading

0 comments on commit 81680e3

Please sign in to comment.