From 877da8de2fac972c1f2d68d900c3ada0fd336032 Mon Sep 17 00:00:00 2001 From: Ricky Date: Fri, 2 Oct 2026 20:59:33 +0200 Subject: [PATCH 1/2] =?UTF-8?q?feat(security):=20cl=C3=A9s=20d'API=20par?= =?UTF-8?q?=20utilisateur=20et=20pour=20soi=20(ADR-0070,=20#665)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Une section par utilisateur (security:*), atteinte depuis sa ligne et sa page, et « My API keys » dans le menu de session (auth:*), sur un seul composant. Le jeton n'est montré qu'une fois, dans une fenêtre qui ne se ferme que par son bouton, et n'est conservé nulle part. Expiration à 90 jours par défaut, avertissement sans expiration, clés expirées marquées, révocation confirmée. Rien n'est proposé sans droit, à une session anonyme ni sur un backend v1. 18e spec, apiKeys. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/checks.yml | 1 + CLAUDE.md | 2 +- src/components/ApiKeys/MyApiKeys.vue | 29 ++ src/components/Common/Breadcrumb.vue | 1 + src/components/Common/SessionBar.vue | 19 +- .../Security/ApiKeys/ApiKeyList.vue | 252 ++++++++++++++++++ .../Security/ApiKeys/CreateApiKeyModal.vue | 240 +++++++++++++++++ .../Security/ApiKeys/RevokeApiKeyModal.vue | 53 ++++ src/components/Security/Users/ApiKeys.vue | 45 ++++ .../Security/Users/CreateOrUpdate.vue | 25 +- src/components/Security/Users/UserItem.vue | 21 +- src/routes/children/security.ts | 10 + src/routes/index.ts | 6 + src/services/apiKeys.ts | 145 ++++++++++ src/stores/auth.ts | 21 ++ .../single-backend/apiKeys.spec.js | 185 +++++++++++++ 16 files changed, 1048 insertions(+), 7 deletions(-) create mode 100644 src/components/ApiKeys/MyApiKeys.vue create mode 100644 src/components/Security/ApiKeys/ApiKeyList.vue create mode 100644 src/components/Security/ApiKeys/CreateApiKeyModal.vue create mode 100644 src/components/Security/ApiKeys/RevokeApiKeyModal.vue create mode 100644 src/components/Security/Users/ApiKeys.vue create mode 100644 src/services/apiKeys.ts create mode 100644 test/e2e/cypress/integration/single-backend/apiKeys.spec.js diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 70caf3aaf..79b387f4a 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -99,6 +99,7 @@ jobs: spec: - login - users + - apiKeys - roles - profiles - resetpassword diff --git a/CLAUDE.md b/CLAUDE.md index 74bbe819d..e1722a5ba 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -46,7 +46,7 @@ proposer de migrer Vue en premier : `bootstrap-vue` 2 ne tourne pas sous ## Garde-fou -Les 17 specs Cypress (`test/e2e/cypress/integration/single-backend/`) sont le +Les 18 specs Cypress (`test/e2e/cypress/integration/single-backend/`) sont le seul filet de sécurité du chantier — il n'y a pas de tests unitaires. Toute PR de migration doit passer les specs du domaine touché. Ne jamais désactiver une spec pour faire passer une migration : c'est le signal que la migration est fausse. diff --git a/src/components/ApiKeys/MyApiKeys.vue b/src/components/ApiKeys/MyApiKeys.vue new file mode 100644 index 000000000..54397b940 --- /dev/null +++ b/src/components/ApiKeys/MyApiKeys.vue @@ -0,0 +1,29 @@ + + + diff --git a/src/components/Common/Breadcrumb.vue b/src/components/Common/Breadcrumb.vue index 0500aaae2..95513b5ca 100644 --- a/src/components/Common/Breadcrumb.vue +++ b/src/components/Common/Breadcrumb.vue @@ -15,6 +15,7 @@ 'SecurityUsersCreate', 'SecurityUsersUpdate', 'SecurityUsersEditCustomMapping', + 'SecurityUsersApiKeys', ]) " > diff --git a/src/components/Common/SessionBar.vue b/src/components/Common/SessionBar.vue index 0a5a8dc05..7d9d68dd5 100644 --- a/src/components/Common/SessionBar.vue +++ b/src/components/Common/SessionBar.vue @@ -66,6 +66,16 @@ +