"Upload: Create" chave de API insuficiente?

Estou usando o seguinte código para fazer upload via API:

# E pergunte ao Discourse para onde enviá-lo.
r = requests.post(
    f"https://{DISCOURSE}/uploads/generate-presigned-put", json=file_info, headers=HEADERS)
if r.status_code != 200:
    print(
        f"Erro ao perguntar para onde enviar a imagem: obteve {r.status_code}", file=sys.stderr)
    sys.exit(1)

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

# Agora coloque-o onde nos foi dito para colocar.
r = requests.put(upload_url, data=image_data)
if r.status_code != 200:
    print(
        f"Erro ao enviar imagem para armazenamento externo: obteve {r.status_code}", file=sys.stderr)
    sys.exit(1)

# E diga ao Discourse que funcionou, e obtenha um ID para o qual possamos fazer referência mais 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"Erro ao completar o upload: obteve {r.status_code}", file=sys.stderr)
    sys.exit(1)
image_id = r.json()['id']

Isso funciona com uma chave de API “de acesso total”, mas quando tento usar uma granular com o escopo “uploads: create”, recebo um erro 403 ao fazer post para /uploads/generate-presigned-put.

2 curtidas

Boa observação, vamos resolver isso. Tenha em mente que o protocolo é um pouco mais complexo agora que fazemos upload diretamente para o S3.

2 curtidas

Eu só comecei a usar a API para isso depois que vocês mudaram, então, até onde sei, este é o nível normal de complicação. :slight_smile:

Existem situações em que o seguinte não é suficiente?

  1. POST informações do arquivo para /uploads/generate-presigned-put
    • o resultado inclui uma URL remota para onde fazer o upload (que inclui parâmetros de autenticação) e um ID de upload exclusivo
  2. PUT dados da imagem para a URL acima
    • lidar com erro se isso falhar
  3. POST o ID de upload de cima para /uploads/complete-external-upload
    • o resultado é um ID de imagem que se pode usar em outros lugares na API (como criação de distintivos)

Olá @mattdm, atualizei o escopo da chave de API para abranger essas novas ações para nosso fluxo de upload direto e também implantei seu site. Por favor, me avise se você ainda tiver problemas.

Confirmado! Funciona agora. Obrigado!

3 curtidas

Este tópico foi fechado automaticamente após 20 horas. Novas respostas não são mais permitidas.