Discourse API, 키 또는 사용자 거부로 인한 액세스 실패

모더레이터로서 디스커스 포럼에 대해 API를 사용해보고 싶습니다. 보통 활성화되어 있었고 API 키를 얻는 데 성공했습니다. 다음 스크립트를 사용했습니다:

32자 길이의 키를 가져오는 데 성공했는데(이게 맞는 건가요?), 그리고 내 계정의 보안 설정에서 해당 앱은 다음 권한으로 표시됩니다:

Read all
Write all
Live updates
Push notifications to external services
Read and clear notifications
Read user session info
Create a one-time login token

그렇게 보이면 꽤 괜찮아 보입니다. 하지만 다음 스크립트로 접근을 시도할 때:

from pydiscourse import DiscourseClient

client = DiscourseClient(
        'https://forum.example.com',
        api_username='tflidd',
        api_key='388b79103056fede1d3223dae032df99')

client.user("tflidd")

Python 라이브러리이므로 작동할 것으로 생각됩니다. api_key는 이 특정 형식을 가지고 있으며, 실제 키가 아닙니다. 사용자 이름 또는 API 키가 유효하지 않다는 오류가 발생합니다.

사용자 이름을 사용해야 하는지, 아니면 앱 이름을 사용해야 하는가요?
API 키는 적어도 형식적으로는 올바른가요, 아니면 복호화 과정에서 문제가 생긴 건가요?

여기서처럼 curl을 사용했을 때:

curl https://forum.example.com/t/95783.json\ -H 'Api-Key: 388b79103056fede1d3223dae032df99'\ -H 'Api-Username: tflidd'

또는 다음 오류가 발생합니다:
{"errors":["You are not permitted to view the requested resource. The API username or key is invalid."],"error_type":"invalid_access"}

웹 브라우저에 로그인된 상태에서 동일한 URL의 json을 브라우저로 열면 브라우저에 올바른 json 객체가 표시됩니다. 즉, 해당 토픽이 존재하며 접근 권한이 있다는 뜻입니다(심지어 공개 토픽이었습니다).

저는 모더레이터일 뿐이며 직접적인 관리자 접근 권한은 없습니다. 무엇을 찾아봐야 할지 방향을 제시해 주신다면 로그에서 더 많은 정보를 요청할 수 있습니다.

관련이 된다면, 설치된 버전은 3.2.0.beta4-dev입니다.

DiscourseClient 파이썬 라이브러리는 Admin API 키(Admin → API)와 함께 작동하도록 설계되었습니다.
generate_api_key에서 생성하는 것은 Client API 키입니다.

대신 API-User-Key와 API-User-Username 헤더를 전달해야 합니다.
예를 들어:

curl https://forum.example.com/t/95783.json -H 'Api-User-Key: 388b79103056fede1d3223dae032df99' -H 'Api-User-Username: tflidd'`

:+1: 이 방법으로 작동합니다. 이 문제를 해결하는 데 얼마나 많은 시간을 보냈는지 상상도 못하실 거예요.

하지만 API 엔드포인트는 여기에 설명된 것과 동일합니다.

?

(만약 그렇다면, 관리자 API 키로 인증하는 방법뿐 아니라 클라이언트 API 키에 대해서도 언급해 주시면 좋겠습니다.)

pydiscourse 클라이언트의 경우, 다른 헤더를 사용하도록 하는 임시 해결책이 있습니다:

from pydiscourse import DiscourseClient

client = DiscourseClient(
        'https://forum.example.com',
        api_username='tflidd',
        api_key='388b79103056fede1d3223dae032df99')

headers = {
            "Accept": "application/json; charset=utf-8",
            "User-Api-Key": '388b79103056fede1d3223dae032df99',
            "User-Api-Username": 'tflidd',
        }

slug = "abc"
topic_id = 1234

client.topic(slug=slug, topic_id=topic_id, override_request_kwargs=override_request_kwargs)