zestedesavoir/zds-site

Quelques problèmes avec l'API lorsque le grant-type est "client credentials"

philippemilink opened this issue · 0 comments

Plusieurs petits problèmes avec l'API, initialement évoqués sur le forum, et également rapportés par Sentry.

  1. Se connecter en tant qu'admin
  2. Aller dans la zone d'admin http://127.0.0.1:8000/admin, ajouter une nouvelle application Oauth2
  3. Choisir un client type Public et un Authorization grant type Client credentials, l'associer à l'utilisateur user1. Noter le client id, le user id et le client secret. Sauvegarder.
  4. Dans un terminal :
    ZDS_CRED=$(echo -n '<le client id>:<le client secret>' | base64) 
    curl -X POST -H "Authorization: Basic $ZDS_CRED" -H "Cache-Control: no-cache" -H "Content-Type: application/x-www-form-urlencoded" http://127.0.0.1:8000/oauth2/token/ -d '{"grant_type": "client_credentials"}'
    curl -X GET -H "Authorization: Bearer <l'access token>" "http://127.0.0.1:8000/api/forums/message/108/karma/" # ou autre id de message qui existe à la place de 108

Là on se prend une erreur 500. La backtrace dans le terminal qui a lancé ZdS est plus lisible que le code HTML renvoyé par la commande curl.

De ce que je comprends, avec une application authentifiée avec un client credentials, on n'a pas d'utilisateur associé à la requête, donc il faut changer cette ligne en :

if request is not None and request.user is not None:

Maintenant, dans zds/settings/dev.py, passer DEBUG à False. Relancer la dernière commande curl pour obtenir le karma, on obtient maintenant une erreur dans la génération de la page d'erreur 500, à cet endroit, car on essaie d'accéder à un attribut de user qui est NULL.

On peut corriger ces différents points, mais je me demande :

  • est-ce normal qu'on n'ait pas d'utilisateur associé à la requête lorsqu'on interagit avec l'API avec un client credentials ?
  • est-ce que ce ne serait pas plus simple de désactiver la possibilité d'avoir des applications avec des grant type client credentials ? (dans notre doc, on recommande plutôt d'utiliser des ressource owner-based)