「Upload: Create」API 키가 부족합니까?

다음 코드를 사용하여 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에 성공했음을 알리고 나중에 참조할 수 있는 id를 가져옵니다.
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']

이 코드는 “전체 액세스(all access)” API 키를 사용할 때는 정상 작동하지만, “uploads: create” 범위를 가진 세분화된 API 키를 사용하려고 하면 /uploads/generate-presigned-put에 대한 post 요청 시 403 오류가 발생합니다.

2개의 좋아요

좋은 지적 감사합니다. 이 문제를 수정하겠습니다. 이제 S3에 직접 업로드를 수행하기 때문에 프로토콜이 다소 복잡해졌다는 점을 염두에 두시기 바랍니다.

2개의 좋아요

API 전환 후에야 이 API를 사용하기 시작했기 때문에, 제 지식 범위 내에서는 이것이 일반적인 복잡도의 수준인 것 같습니다. :slight_smile:

다음과 같은 과정이 충분하지 않은 상황이 있을까요?

  1. /uploads/generate-presigned-put으로 파일 정보를 POST
    • 응답에는 업로드할 원격 URL(인증 매개변수 포함)과 고유한 업로드 ID가 포함됩니다.
  2. 위의 URL로 이미지 데이터를 PUT
    • 실패 시 오류를 처리합니다.
  3. 위의 업로드 ID를 /uploads/complete-external-upload로 POST
    • 응답으로 API의 다른 곳(예: 배지 생성)에서 사용할 수 있는 이미지 ID가 반환됩니다.

@mattdm 안녕하세요. 직접 업로드 플로우에 사용되는 새로운 액션들을 포함하도록 API 키 범위를 업데이트했으며, 사이트도 배포했습니다. 여전히 문제가 발생한다면 알려주세요.

확인했습니다! 이제 작동합니다. 감사합니다!

3개의 좋아요

이 주제는 20시간 후 자동으로 닫혔습니다. 더 이상 답변을 할 수 없습니다.