Недостаточно прав у ключа API "Upload: Create"?

Я использую следующий код для загрузки через API:

# И спрашиваем Discourse, куда отправить файл.
r = requests.post(
    f"https://{DISCOURSE}/uploads/generate-presigned-put", json=file_info, headers=HEADERS)
if r.status_code != 200:
    print(
        f"Ошибка при запросе места для загрузки изображения: получен код {r.status_code}", file=sys.stderr)
    sys.exit(1)

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

# Теперь загружаем туда, куда нам указали.
r = requests.put(upload_url, data=image_data)
if r.status_code != 200:
    print(
        f"Ошибка загрузки изображения во внешнее хранилище: получен код {r.status_code}", file=sys.stderr)
    sys.exit(1)

# И сообщаем Discourse, что всё прошло успешно, получая идентификатор, который можно использовать позже.
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"Ошибка завершения загрузки: получен код {r.status_code}", file=sys.stderr)
    sys.exit(1)
image_id = r.json()['id']

Это работает с API-ключом «полный доступ», но при попытке использовать ограниченный ключ с областью действия «uploads: create» я получаю ошибку 403 на post к /uploads/generate-presigned-put.

2 лайка

Хорошо подмечено, мы это исправим. Имейте в виду, что протокол стал немного сложнее, так как теперь мы загружаем файлы напрямую в S3.

2 лайка

Я начал использовать этот API только после вашего переключения, поэтому, насколько мне известно, такой уровень сложности является нормальным. :slight_smile:

Бывают ли ситуации, когда следующего недостаточно?

  1. Отправить POST-запрос с информацией о файле на /uploads/generate-presigned-put
    • результат включает удалённый URL для загрузки (содержащий параметры аутентификации) и уникальный идентификатор загрузки
  2. Отправить PUT-запрос с данными изображения по указанному выше URL
    • обработать ошибку, если это не удастся
  3. Отправить POST-запрос с идентификатором загрузки из пункта выше на /uploads/complete-external-upload
    • результат — идентификатор изображения, который можно использовать в других частях API (например, при создании значков)

Привет, @mattdm! Я обновил область действия API-ключа, чтобы включить эти новые действия для нашего процесса прямой загрузки, а также развернул ваш сайт. Пожалуйста, дайте знать, если у вас всё ещё возникнут проблемы.

Подтверждено! Теперь работает. Спасибо!

3 лайка

Эта тема была автоматически закрыта через 20 часов. Новые ответы больше не принимаются.