Le point de terminaison API users/by-external/ échoue avec les en-têtes d’autorisation, fonctionne sans

À partir du 24 mars, il semble y avoir eu un changement dans la façon dont l’API Discourse répond aux requêtes.

Aucune modification de code n’a été apportée de notre côté, et la clé API est toujours valide, mais l’un de nos services backend qui tente d’obtenir des informations utilisateur a commencé à échouer lors de l’accès à users/by-external/{id}.json.

Nous envoyons les en-têtes Api-Key et Api-Username avec ces requêtes, qui devraient être obligatoires, conformément à la documentation. Ces requêtes fonctionnent correctement depuis des années.

Maintenant, toutes les requêtes faites à ce point de terminaison échouent avec un 403, et le corps de la réponse :

{
    "errors": [
        "Vous n'êtes pas autorisé à afficher la ressource demandée."
    ],
    "error_type": "invalid_access"
}

Cela se produit également si j’essaie de demander /u/{username}.json.

Étonnamment, lorsque je n’envoie PAS les en-têtes, ces requêtes qui, selon la documentation, nécessitent ces en-têtes d’authentification, répondent en fait avec les données demandées, comme si elles étaient authentifiées.

J’ai également essayé d’envoyer une clé API incorrecte, et la réponse est légèrement différente :

{
    "errors": [
        "Vous n'êtes pas autorisé à afficher la ressource demandée. Le nom d'utilisateur ou la clé API est invalide."
    ],
    "error_type": "invalid_access"
}

Cela me dit que la clé est acceptée, mais indique par erreur qu’elle ne donne pas accès à la ressource, tout en accordant un accès complet aux requêtes non authentifiées.

Je viens également de tester avec une toute nouvelle clé API avec des options globales / tous les utilisateurs, et j’obtiens les mêmes résultats.

4 « J'aime »

Après avoir travaillé là-dessus avec @Tim_Scaffidi, nous avons réalisé que l’utilisateur passé pour Api-Username avait été automatiquement désactivé par SiteSetting.invalidate_inactive_admin_email_after_days. Il y a probablement un bug lié à ce paramètre où les appels API effectués par un utilisateur ne mettent pas à jour l’activité de “connexion” de cet utilisateur.

7 « J'aime »

J’ai réexaminé la question pour voir s’il y avait du code à modifier pour améliorer les choses, mais comme le problème ne survenait que parce qu’une clé API « Tous les utilisateurs » était utilisée, je ne pense pas que nous devrions modifier quoi que ce soit au niveau du code. La meilleure option pour éviter la désactivation des utilisateurs est d’utiliser une clé API « Utilisateur unique » afin que nous puissions vérifier la date de dernière utilisation sur l’enregistrement de la clé API au lieu d’essayer de vérifier la date de dernière connexion sur l’enregistrement de l’utilisateur.

1 « J'aime »