Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Visioplainte : Permettre la connexion à l'api de créneaux en lecture seule #4834

Merged
merged 4 commits into from
Nov 25, 2024

Conversation

victormours
Copy link
Contributor

Contexte

Pour éviter de démarrer un processus de visioplainte alors qu'il n'y a aucun créneau de disponible, l'équipe qui gère le site MaSécurité a aussi besoin d'accéder à l'application pour savoir s'il existe des créneaux.
Nous avons donc mis en place la possibilité de se connecter à l'api avec une clé avec des permissions en lecture seule, pour avoir le minimum de permissions.
Il y a donc deux maintenant clés d'api, celle en lecture-écriture pour Visioplainte, et celle en lecture seule pour MaSécurité.

Solution

On whiteliste les endpoints concernés avec un prepend_before_action

Copy link
Contributor

@adipasquale adipasquale left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 bien joué ! Je n’ai pas testé mais j’ai relu le code attentivement et les specs me font me sentir en masécurité .

J’ai mis une suggestion de signature alternative mais ce n’est vraiment pas indispensable.
Est-ce qu’on rajoute cette nouvelle clé API aux variables d’env du .env.sample ?

Je suis heureux de voir sur https://www.masecurite.interieur.gouv.fr/fr une jolie carte DSFR qui évoque la maltraitance animale. Je vais derechef leur signaler le McDo d’en bas de chez moi.

app/controllers/api/visioplainte/creneaux_controller.rb Outdated Show resolved Hide resolved

protected

def allow_authentication_with_read_only_api_key
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ça me va tout à fait comme ça même si c’est un peu surprenant comme méthode. On pourrait éventuellement rajouter un petit commentaire ici indiquant que cette méthode a vocation à être utilisée en prepend_before_action ?

Et je fais une proposition de signature alternative peut-être un peu plus traditionnelle mais ce n’est absolument pas nécessaire de changer, c’est au cas où ça t’inspire.

Il pourrait y avoir deux méthodes authenticate_with_api_key_with_full_access et authenticate_with_api_key_with_read_access.
La deuxième permettrait l’accès avec l’une ou l’autre clé indifféremment.

Dans le BaseController il y aurait before_action :authenticate_with_api_key_with_full_access.
Sur les routes du crenauxcontroller il y aurait

skip_before_action :authenticate_with_api_key_with_full_access
before_action :authenticate_with_api_key_with_read_access

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

j'avais pensé à une signature dans ce genre, mais j'ai l'impression qu'elle avait quelques petits inconvénients :

  • vu qu'on fait deux appels (le skip_before_action et le before_action), il y a un petit risque d'oublier un des deux, et d'avoir juste le skip, et donc un endpoint qui n'est pas protégé. L'implémentation actuelle permet plutôt de juste ajouter avec un appel "atomique" l'authentification en lecture seule.
  • les outils automatisés de sécurité peuvent avoir tendance à voir des faux positifs si on a des skip_before_action :authenticate_with_api_key_with_full_access
  • quand je vois ce genre de skip_before_action (parfois en faisant une recherche qui affiche des résultats ligne par ligne), j'ai toujours une petite inquiétude de "est-ce qu'on a bien un autre mécanisme pour assurer l'authentification" (un peu une version humaine du point précédent), et là aussi un appel unique permet d'éviter ça.

En tout cas, c'est une bonne idée d'ajouter un commentaire explicatif, je fais ça.

@@ -27,3 +28,9 @@ Les équipes de SensioLabs nous indiquent travailler sur l’intégration de leu

L’API est implémenté par des contrôleurs tous regroupés dans `app/controllers/api/visioplainte`.
Les appels à notre API sont authentifiées via un header `X-VISIOPLAINTE-API-KEY`.

## Intégration avec MaSécurité
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

très cool d’avoir mis de la doc 🙇

@victormours victormours enabled auto-merge (squash) November 25, 2024 09:37
@victormours victormours merged commit cd51b94 into production Nov 25, 2024
15 checks passed
@victormours victormours deleted the visioplainte-read-only-key branch November 25, 2024 09:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
Status: ✅ Done
Development

Successfully merging this pull request may close these issues.

3 participants