API Mastodon

Aide mémoire. Le principe est le suivant :

Création et enregistrement de l'app

curl -F client_name=app_test \
> -F scopes=read%20write%20follow%20push \
> -F redirect_uris=urn:ietf:wg:oauth:2.0:oob \
> -X POST https://mastodon.zaclys.com/api/v1/apps
  • scopes indique les autorisations de l'app. On encode l'espace qui doit les séparer par %20
  • redirect_uris doit prendre la valeur urn:ietf:wg:oauth:2.0:oob car dans notre cas, il ne faut pas rediriger l'utilisateur final de l'app après lui avoir procédé à l'authentification

La réponse du serveur ressemble à ça :

{“id”:“1426”,“name”:“app_test”,“website”:null,“redirect_uri”:“urn:ietf:wg:oauth:2.0:oob”,“client_id”:“<UNE_LONGUE_CHAINE>”,“client_secret”:“<UNE_LONGUE_CHAINE>”,“vapid_key”:“<UNE_LONGUE_CHAINE>”}

Pour la suite, c'est surtout client_id et client_secret qui nous intéressent.

Authentification

Elle se passe en 2 étapes. Le principe est de recueillir l'autorisation de l'utilisateur final pour que l'app accède à son compte. Cette autorisation prend la forme d'un code qu'il faut alors “réinjecter” dans l'app. On obtient alors le token qu'on utilisera pour la suite des opérations.

Pour obtenir cette autorisation :

curl -F response_type=code \
> -F client_id=<CLIENT_ID> \
> -F client_secret=<CLIENT_SECRET> \
> -F scope="read write follow push" \
> -F redirect_uri=urn:ietf:wg:oauth:2.0:oob \
> -X POST https://mastodon.zaclys.com/oauth/authorize

FIXME sauf qu'en l'état, ça ne peut pas fonctionner : il faut déjà se connecter en tant qu'utilisateur avec curl (et je ne sais pas encore faire)

Contournement : dans son navigateur, en étant connecté à son compte mastodon, ouvrir l'url suivante : https://mastodon.zaclys.com/oauth/authorize?client_id=<CLIENT_ID>&client_secret=<CLIENT_SECRET>&scope=read%20write%20follow%20push&redirect_uri=urn:ietf:wg:oauth:2.0:oob ; on récupère alors le code d'autorisation puis on poursuit :

curl -F client_id=<CLIENT_ID> \
> -F client_secret=<CLIENT_SECRET> \
> -F grant_type=authorization_code \
> -F code=<CODE_RECUPÉRÉ_À_LINSTANT> \
> -F redirect_uri=urn:ietf:wg:oauth:2.0:oob \
> -X POST https://mastodon.zaclys.com/oauth/token

La réponse du serveur ressemble à ça :

{“access_token”:“<TOKEN>”,“token_type”:“Bearer”,“scope”:“read write follow push”,“created_at”:1564847683}

Il convient donc de conserver le token pour l'inclure dans ses requêtes, avec curl, de la sorte : -H 'Authorization: Bearer <TOKEN>

Utilisation

Il suffit donc désormais d'exécuter ses requêtes comme, par exemple :

curl -X GET https://mastodon.zaclys.com/api/v1/timelines/home -H 'Authorization: Bearer <TOKEN>'

Les trucs qui m'ont posé problème

  • Erreur lors de la déclaration des scopes lors de l'enregistrement de l'app. Ça ne renvoie pas d'erreur du serveur, mais ça bloque la suite. Le plus simple/sage est peut-être d'utiliser des guillemets pour séparer les valeurs : -F scopes=“read write follow push”
  • Attention : c'est scopes au pluriel lors de l'enregistrement de l'app, mais scope au singulier lors de la phase d'autorisation. Idem pour redirect_uris/redirect_uri
Imprimer/exporter
QR Code
QR Code api_mastodon (generated for current page)