¿Clave API "Upload: Create" insuficiente?

Estoy usando el siguiente código para subir a través de la API:

# Y le preguntamos a Discourse a dónde enviarlo.
r = requests.post(
    f"https://{DISCOURSE}/uploads/generate-presigned-put", json=file_info, headers=HEADERS)
if r.status_code != 200:
    print(
        f"Error al preguntar dónde subir la imagen: se obtuvo {r.status_code}", file=sys.stderr)
    sys.exit(1)

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

# Ahora lo ponemos donde se nos indicó.
r = requests.put(upload_url, data=image_data)
if r.status_code != 200:
    print(
        f"Error al subir la imagen al almacenamiento externo: se obtuvo {r.status_code}", file=sys.stderr)
    sys.exit(1)

# Y le decimos a Discourse que funcionó, y obtenemos un id al que podemos referenciar más tarde.
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"Error al completar la subida: se obtuvo {r.status_code}", file=sys.stderr)
    sys.exit(1)
image_id = r.json()['id']

Esto funciona con una clave API de “acceso total”, pero cuando intento usar una granular con el ámbito “uploads: create”, obtengo un error 403 en post a /uploads/generate-presigned-put.

2 Me gusta

Buena observación, lo solucionaremos. Ten en cuenta que el protocolo es ahora algo más complejo, ya que subimos directamente a S3.

2 Me gusta

Como acabo de empezar a usar la API después de que la cambiarais, hasta donde yo sé, este es el nivel normal de complicación. :slight_smile:

¿Hay situaciones en las que lo siguiente no es suficiente?

  1. POST información del archivo a /uploads/generate-presigned-put
    • el resultado incluye una URL remota a la que subir (que incluye parámetros de autenticación) y un ID de carga único
  2. PUT datos de imagen a la URL de arriba
    • manejar el error si esto falla
  3. POST el ID de carga de arriba a /uploads/complete-external-upload
    • el resultado es un ID de imagen que se puede usar en otros lugares de la API (como la creación de insignias)

Hola @mattdm He actualizado el ámbito de la clave de API para cubrir estas nuevas acciones en nuestro flujo de carga directa y también he implementado tu sitio. Por favor, házmelo saber si sigues teniendo problemas.

¡Confirmado! Funciona ahora. ¡Gracias!

3 Me gusta

Este tema se cerró automáticamente después de 20 horas. Ya no se permiten nuevas respuestas.