AJAX 호출에서 API 키를 어떻게 사용하나요?

Discourse API를 통해 그룹에 대한 정보를 프로그래매틱하게 가져오려고 하고 있습니다. 이 관련 코드는 커스텀 대시보드의 </head> 아래에 있습니다. 저는 포럼의 관리자입니다.

현재 작동하지 않고 있으며, API 키의 작동 방식을 제대로 이해하지 못해서 그런 것 같습니다.

특정 페이지를 방문하는 모든 사용자가 방문할 때마다 Discourse가 API를 호출하여 그룹에 대한 정보를 가져오도록 하려면, 올바른 API 키 설정은 무엇인가요?

현재까지 진행한 내용은 다음과 같습니다:

대시보드에서 API → New API Key로 이동했습니다.在那里, "User Level"을 선택해야 합니다. 기초적인 질문이라 죄송하지만, 여기서 "User Level"은 무엇을 의미하나요? (API 호출은 해당 페이지를 방문하는 모든 사용자가 있을 때마다 실행되어야 합니다.)

"All Users"를 선택했습니다. 그런 다음 토큰을 생성했습니다.

그런 다음, 커스텀 css/html 대시보드의 </head> 아래에서 관련 <script> 태그 사이에 다음 내용을 입력했습니다:

var groupName = [RELEVANT GROUP NAME]
var token = [TOKEN I GENERATED]
$.ajax({
     url: 'https://myforum.com/groups/groupName.json',
      contentType: "application/json",
      headers: {
          "Api-Key": token,
          "Api-Username": "system"
        },
        dataType: 'json',
        success: function(result){
             console.log('result = ' + result);
         }
})

코드는 실행되지만, 권한이 없다는 오류가 반환됩니다(저는 관리자이고 실험에 사용하고 있는 그룹의 멤버임에도 불구하고).

무엇을 변경해야 하나요?

이렇게 하면 사이트 열람 권한이 있는 모든 사람에게 All Users API 키가 노출되지 않을까요? 테마 컴포넌트에서 그룹 데이터를 가져오는 다른 방법을 찾아보시는 것이 좋겠습니다.

사용자가 사용할 수 있는 JSON 로드에는 필요한 그룹 정보가 없을 수 있습니다. 이 경우 직렬화기에 해당 정보를 추가하는 방법을 알아봐야 합니다. 기존 테마 컴포넌트와 플러그인에서 “add to serializer”, “addToSerializer”, “add_to_serializer” 등을 검색하면 도움이 될 수 있습니다.

하지만 어떤 경우든 코드가 작동해야 하지 않나요? API는 그룹에 대한 정보를 가져올 수 있는 기능을 제공합니다. 이 기능이 어떻게 작동하는지 여전히 혼란스럽습니다.

특정 그룹에 대한 정보를 가져오기 위해 API를 사용하는 일반적인 방법은 무엇인가요?

제가 가장 필요한 핵심 정보는 해당 사용자가 그룹의 소유자인지 여부입니다. 이 정보는 Json API를 통해 반환됩니다. 따라서 사용자가 특정 페이지에 접근할 때, API에 호출을 보내 그룹에 대한 정보를 가져오려 합니다. 기본 응답에는 클라이언트에 로그인한 사용자가 소유자인지 여부가 포함됩니다.

이것은 API의 단순한 구현으로 보입니다. 하지만 이 작업에는 API 키가 필요한 것 같고, 지금까지 사용해 온 방법은 작동하지 않습니다.

이 작업은 Json API가 제공하는 기본적인 기능 중 하나이므로, 별도의 플러그인이나 테마 컴포넌트를 만들 필요가 없다고 생각합니다.

API 키를 노출하지 않으면서 API를 사용하는 방법이 있는지 궁금합니다(즉, API를 사용하는 표준/최선의 방법은 무엇인지).

수정: 만약 이 API 호출에 이것이 적절하지 않은 경우라면, 직렬화(serialization)가 필요할 것입니다. 해당 작업에 대한 작동하는 코드 예시가 있는 분이 계신가요? add_to_serializer 메서드가 있다는 것은 알지만, 문법을 제대로 작동시키지 못했고, 작동하는 예시를 찾는 데 어려움을 겪었습니다.

@JQ331 님, 안녕하세요.

참고로 제가 빠르게 확인해 보았습니다. 스태프 멤버로 테스트 포럼에 로그인하여 staff 그룹을 조회해 보았고, 예상된 결과를 얻었습니다:

스태프 멤버가 조회한 스태프 그룹의 JSON 객체
{
  "group": {
    "id": 3,
    "automatic": true,
    "name": "staff",
    "display_name": "staff",
    "user_count": 1,
    "mentionable_level": 0,
    "messageable_level": 0,
    "visibility_level": 1,
    "automatic_membership_email_domains": null,
    "primary_group": false,
    "title": null,
    "grant_trust_level": null,
    "incoming_email": null,
    "has_messages": false,
    "flair_url": null,
    "flair_bg_color": null,
    "flair_color": null,
    "bio_raw": null,
    "bio_cooked": null,
    "bio_excerpt": null,
    "public_admission": false,
    "public_exit": false,
    "allow_membership_requests": false,
    "full_name": null,
    "default_notification_level": 3,
    "membership_request_template": null,
    "is_group_user": true,
    "is_group_owner": true,
    "members_visibility_level": 0,
    "can_see_members": true,
    "publish_read_state": false,
    "is_group_owner_display": false,
    "mentionable": false,
    "messageable": false
  },
  "extras": {
    "visible_group_names": [
      "admins",
      "moderators",
      "staff",
      "trust_level_0",
      "trust_level_1",
      "trust_level_2",
      "trust_level_3",
      "trust_level_4"
    ]
  }
}

… 그리고 로그아웃 상태로 같은 작업을 시도해 보았는데, 이 경우에도 예상된 결과가 반환되었습니다:

{"errors":["You are not permitted to view the requested resource."],"error_type":"invalid_access"}

즉, 제 생각에는 모든 것이 정상적으로 작동하고 있는 것으로 보입니다.

참고로 @JQ331 님, 로그인된 사용자(브라우저에서)로서 이 작업을 수행할 때 API 키는 필요하지 않았습니다.

    "is_group_owner": true,

@neounix: 답변 감사합니다. 덕분에 헛수고하지 않고 바로 해결할 수 있었습니다. 비인가 응답이 인증 문제 때문인 줄 알았거든요.

결국 말씀하신 대로 이 작업에는 API 키가 필요하지 않았습니다. 오히려 (단순한) 코드 오류였는데, 위에 올린 코드에서 명확히 드러나지만 제가 그전까지 놓치고 있었습니다. (AJAX URL에 변수를 잘못 넣었습니다.)

정상 작동하는 코드는 다음과 같습니다:

var groupName = [RELEVANT GROUP NAME]
var token = [TOKEN I GENERATED]
$.ajax({
     url: 'https://myforum.com/groups/' + groupName + '.json',    //이전에 오류가 발생했던 부분
      contentType: "application/json",
        dataType: 'json',
        success: function(result){
             console.log('full response = ' + JSON.stringify(result));
             console.log('is group owner = ' + result.group.is_group_owner);  //참고: 이 값은 true 또는 null 중 하나가 됩니다           
     }
})

이전에 비인가 응답이 발생했던 이유는, 이전에 입력했던 URL에 그룹 이름이 잘못되어 있었기 때문입니다. ("groupName"이라는 문자열 그대로 읽혔습니다.)