Clé API "Upload: Create" insuffisante ?

J’utilise le code suivant pour téléverser via l’API :

# Et demandons à Discourse où l'envoyer.
r = requests.post(
    f"https://{DISCOURSE}/uploads/generate-presigned-put", json=file_info, headers=HEADERS)
if r.status_code != 200:
    print(
        f"Erreur lors de la demande de l'emplacement de téléversement de l'image : reçu {r.status_code}", file=sys.stderr)
    sys.exit(1)

upload_url = r.json()['url']
upload_uid = r.json()['unique_identifier']

# Maintenant, mettons-la là où on nous l'a dit.
r = requests.put(upload_url, data=image_data)
if r.status_code != 200:
    print(
        f"Erreur lors du téléversement de l'image vers le stockage externe : reçu {r.status_code}", file=sys.stderr)
    sys.exit(1)

# Et disons à Discourse que cela a fonctionné, et obtenons un identifiant auquel nous pourrons faire référence plus tard.
r = requests.post(f"https://{DISCOURSE}/uploads/complete-external-upload",
                  data=f'unique_identifier={upload_uid}', headers=HEADERS)
if r.status_code != 200:
    print(f"Erreur lors de la complétion du téléversement : reçu {r.status_code}", file=sys.stderr)
    sys.exit(1)
image_id = r.json()['id']

Cela fonctionne avec une clé API “tous accès”, mais lorsque j’essaie d’en utiliser une granulaire avec la portée “uploads: create”, j’obtiens une erreur 403 sur post vers /uploads/generate-presigned-put.

2 « J'aime »

Bien vu, nous allons régler cela. Gardez à l’esprit que le protocole est désormais un peu plus complexe puisque nous téléchargeons directement sur S3.

2 « J'aime »

Je n’ai commencé à utiliser l’API qu’après votre changement, donc pour autant que je sache, c’est le niveau de complexité normal. :slight_smile:

Existe-t-il des situations où ce qui suit n’est pas suffisant ?

  1. POST les informations du fichier à /uploads/generate-presigned-put
    • le résultat inclut une URL distante vers laquelle téléverser (qui inclut des paramètres d’authentification) et un ID de téléversement unique
  2. PUT les données de l’image à l’URL ci-dessus
    • gérer l’erreur si cela échoue
  3. POST l’ID de téléversement ci-dessus à /uploads/complete-external-upload
    • le résultat est un ID d’image que l’on peut utiliser ailleurs dans l’API (comme la création d’un badge)

Salut @mattdm J’ai mis à jour la portée de la clé API pour couvrir ces nouvelles actions pour notre flux de téléchargement direct, et j’ai également déployé votre site, faites-moi savoir si vous rencontrez encore des problèmes.

Confirmé ! Ça marche maintenant. Merci !

3 « J'aime »

Ce sujet a été automatiquement fermé après 20 heures. Les nouvelles réponses ne sont plus autorisées.