Erreur id_token audience and client_id don't match à la déconnexion #56

Open
opened 2025-06-25 19:07:27 +02:00 by eloi · 4 comments
Owner

Parfois à la déconnexion on obtient l'erreur id_token audience and client_id don't match sur Canaille (par exemple à cette adresse).

Je pense que c'est du au fait qu'Escut enregistre dynamiquement un client auprès de Canaille. Comme la capture d'écran le montre, il y en a parfois beaucoup, créés à quelques secondes d'écart pour certains :

L'erreur vient vraisemblablement du fait que le client qui a émis le token du client n'est pas le client qui est utilisé à la déconnexion.

Lines 16 to 17 in 2dd342d
if not app.config.get("OAUTH_CLIENT_ID"):
register_oauth_client(app)

Je pense que ce code vient du client de Canaille, mais je ne suis pas sûr que ce soit adapté à Escut.
Je suppose qu'à chaque édition du code d'Escut, l'auto-reload crée un nouveau client sur Canaille, ce qui n'est pas souhaitable.

  • soit on devrait inscrire le client_id et le client_secret dans la conf après l'enregistrement du client
  • soit on désactive l'enregistrement dynamique du client, et on laisse les utilisateurs les créer manuellement
    • soit directement dans canaille (c'est moins user-friendly)
    • soit avec un utilitaire en CLI depuis escut (c'est plus user friendly)
Parfois à la déconnexion on obtient l'erreur `id_token audience and client_id don't match` sur Canaille (par exemple à [cette adresse](http://canaille.localhost:5000/oauth/end_session?client_id=TCYxvzc0ABnwHs6cyDYeO7PAB6sgwdCAlVaSZhgVzq&id_token_hint=eyJhbGciOiJSUzI1NiIsImtpZCI6Inpidnk1X0pRZHFhanJ3eTVZc3JqZnMzWWxpMUpwRFhFVWxteGxqZ0NqT1kiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2NhbmFpbGxlLmxvY2FsaG9zdDo1MDAwIiwiYXVkIjpbImZPNFNqakY0ODhFdUMwcGljSlY4bFpJRlZScjF3VTRwWnZBSGhvMWxXWCJdLCJpYXQiOjE3NTA4NjIyMzYsImV4cCI6MTc1MDg2NTgzNiwiYXV0aF90aW1lIjoxNzUwODYyMDA2LjU5MDMwNSwibm9uY2UiOiI4TlVZcE1qcmFjWWxrckgyWUJFRiIsImF0X2hhc2giOiJ4bXA2aWd3RWZfTnZZd3c2RFFPRnlRIiwic3ViIjoiYWRtaW4iLCJuYW1lIjoiYWRtaW4gYWRtaW4iLCJnaXZlbl9uYW1lIjoiYWRtaW4iLCJmYW1pbHlfbmFtZSI6ImFkbWluIiwiZW1haWwiOiJhZG1pbkB5b2xvLmNvbSIsImxvY2FsZSI6ImF1dG8iLCJ1cGRhdGVkX2F0IjoxNzUwODYyMDA2fQ.fHeuMboetfEeORShnDSAirYdcdA5E3cJrJcGM7FhYsDEg3TbpzXCe2_CxfAiH43gtQo17ZMzwHacFbxVx_P1SfnrRJOEcUwGG9YWszti3EINFqjecUm0ng7R2pKKu8VXV81WQynsisGOttBr1u1NpivUlad6xynVrjQXO003dKpIkLwtEPeLSUy6EfmvobohSL4nXT_o1dveBZ0wxatAoAzalTkUYWEYQpvZVRnEfimVvn5nCJufsIjop96eZ0PSvkjJspeGKsuZItyrdcjy-BGoFrFDZf5fRogf6T2xzWA9_JMyPGu0l5WRqquApfJp3XILBqF8aojD9VArrBF8hg&post_logout_redirect_uri=http://escut.localhost:4000/retour-deconnexion)). Je pense que c'est du au fait qu'Escut enregistre dynamiquement un client auprès de Canaille. Comme la capture d'écran le montre, il y en a parfois beaucoup, créés à quelques secondes d'écart pour certains : L'erreur vient vraisemblablement du fait que le client qui a émis le token du client n'est pas le client qui est utilisé à la déconnexion. https://forge.yaal.coop/yaal/escut/src/commit/2dd342db95b3d58ba808da8a3ac49dbc1bfc7ee4/web/app/oauth.py#L16-L17 Je pense que ce code vient du client de Canaille, mais je ne suis pas sûr que ce soit adapté à Escut. Je suppose qu'à chaque édition du code d'Escut, l'auto-reload crée un nouveau client sur Canaille, ce qui n'est pas souhaitable. - soit on devrait inscrire le client_id et le client_secret dans la conf après l'enregistrement du client - soit on désactive l'enregistrement dynamique du client, et on laisse les utilisateurs les créer manuellement - soit directement dans canaille (c'est moins user-friendly) - soit avec un utilitaire en CLI depuis escut (c'est plus user friendly)
Owner

@eloi wrote in #56 (comment):

* soit on devrait inscrire le client_id et le client_secret dans la conf après l'enregistrement du client

Pourrais-tu détailler cette solution ? S'agit-il d'inscrire ces paramètres automatiquement dans un fichier .env ? (Sachant que nous sommes à l'intérieur d'un container docker à ce moment-là.)

@eloi wrote in https://forge.yaal.coop/yaal/escut/issues/56#issue-74: > * soit on devrait inscrire le client_id et le client_secret dans la conf après l'enregistrement du client Pourrais-tu détailler cette solution ? S'agit-il d'inscrire ces paramètres automatiquement dans un fichier .env ? (Sachant que nous sommes à l'intérieur d'un container docker à ce moment-là.)
Author
Owner

Oui par exemple, un fichier .env pourrait faire l'affaire. (Note que docker compose peut charger les fichiers .env, ou bien qu'ils peuvent être montés comme volumes Docker, et donc être accessibles à l'intérieur du conteneur, puis surveillé par Flask avec --extra-files pour un rechargement automatique de Flask lorsque le fichier .env est édité).

Je ne sais pas trop ce que j'en pense, éditer directement un .env c'est un peu cracra non ?

Oui par exemple, un fichier .env pourrait faire l'affaire. (Note que docker compose peut charger les fichiers .env, ou bien qu'ils peuvent être montés comme volumes Docker, et donc être accessibles à l'intérieur du conteneur, puis surveillé par Flask avec `--extra-files` pour un rechargement automatique de Flask lorsque le fichier .env est édité). Je ne sais pas trop ce que j'en pense, éditer directement un .env c'est un peu cracra non ?
Owner

Ok.
A voir, Lago le fait par exemple (il écrit une clé dans le fichier .env automatiquement si elle n'était pas renseignée).
Après si tu penses que le CLI est le plus propre on peut partir sur ça, mais j'avais peur qu'il ne serve qu'à ça et que ce soit une solution un peu overkill du coup.

Ok. A voir, Lago le fait par exemple (il écrit une clé dans le fichier .env automatiquement si elle n'était pas renseignée). Après si tu penses que le CLI est le plus propre on peut partir sur ça, mais j'avais peur qu'il ne serve qu'à ça et que ce soit une solution un peu overkill du coup.
felix self-assigned this 2025-07-07 16:13:46 +02:00
Owner

Tentative de résolution provisoire : enregistrer les identifiants dans un .env

Tentative de résolution provisoire : enregistrer les identifiants dans un `.env`
Sign in to join this conversation.
No milestone
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: yaal/escut#56
No description provided.