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);
}
})
코드는 실행되지만, 권한이 없다는 오류가 반환됩니다(저는 관리자이고 실험에 사용하고 있는 그룹의 멤버임에도 불구하고).
사용자가 사용할 수 있는 JSON 로드에는 필요한 그룹 정보가 없을 수 있습니다. 이 경우 직렬화기에 해당 정보를 추가하는 방법을 알아봐야 합니다. 기존 테마 컴포넌트와 플러그인에서 “add to serializer”, “addToSerializer”, “add_to_serializer” 등을 검색하면 도움이 될 수 있습니다.
제가 가장 필요한 핵심 정보는 해당 사용자가 그룹의 소유자인지 여부입니다. 이 정보는 Json API를 통해 반환됩니다. 따라서 사용자가 특정 페이지에 접근할 때, API에 호출을 보내 그룹에 대한 정보를 가져오려 합니다. 기본 응답에는 클라이언트에 로그인한 사용자가 소유자인지 여부가 포함됩니다.
이것은 API의 단순한 구현으로 보입니다. 하지만 이 작업에는 API 키가 필요한 것 같고, 지금까지 사용해 온 방법은 작동하지 않습니다.
이 작업은 Json API가 제공하는 기본적인 기능 중 하나이므로, 별도의 플러그인이나 테마 컴포넌트를 만들 필요가 없다고 생각합니다.
API 키를 노출하지 않으면서 API를 사용하는 방법이 있는지 궁금합니다(즉, API를 사용하는 표준/최선의 방법은 무엇인지).
수정: 만약 이 API 호출에 이것이 적절하지 않은 경우라면, 직렬화(serialization)가 필요할 것입니다. 해당 작업에 대한 작동하는 코드 예시가 있는 분이 계신가요? add_to_serializer 메서드가 있다는 것은 알지만, 문법을 제대로 작동시키지 못했고, 작동하는 예시를 찾는 데 어려움을 겪었습니다.
@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"이라는 문자열 그대로 읽혔습니다.)