API CORS 헤더가 올바르지 않습니다

안녕하세요,

인트라넷 사이트에 discourse를 임베드하는 과정에서 문제가 발생하고 있습니다.

API 문서에 따르면, 피드에 액세스하려면 인증을 위해 “API-Key”와 “Api-Username” 헤더가 필요합니다. 그러나 사전 검사(Pre-flight check)에서는 허용된 값으로 “User-API-Key”와 “User-Api-Client-Id”가 표시되고 있습니다.

브라우저를 통하지 않고 호출하면 예상대로 동작합니다. 하지만 브라우저를 통해 호출하면 서버가 “User-API-Key”와 “User-Api-Client-Id”가 필요하다고 주장합니다.

Postman으로 기본 연결을 확인했는데, 이 경우 discourse 문서에 명시된 대로 동작합니다.

문서에 있는 헤더를 전달하면 브라우저가 사전 검사(Pre-flight check)로 인해 요청을 차단하고 Access-Control-Allow-Headers CORS 오류가 발생합니다.

서버가 허용하는 헤더를 전달하면 “not authorised error”가 발생하는데, 이는 애플리케이션이 다른 이름의 값을 기대하기 때문입니다.

docker 설정에 헤더를 추가해 보았지만 적용되지 않는 것 같습니다. 설정에는 CORS가 활성화되어 있고 origin이 '*'로 지정되어 있습니다.

누군가 조언해 주실 수 있을까요?

감사합니다,
Jessica

위에 언급된 사항에 대해 추가 정보가 있는지 궁금합니다. 이는 버그인가요, 아니면 제가 잘못하고 있는 건가요?

감사합니다.
제시카

우리는 서로 다른 두 가지 API 인증 시스템을 갖추고 있으며, 이로 인해 혼란이 생길 수 있습니다.

이것들은 docs.discourse.org에 설명되어 있는 '관리자 API’용입니다. 이는 JavaScript 클라이언트에서 사용하도록 설계되지 않았습니다.

이것들은 JavaScript 클라이언트(그리고 따라서 CORS를 지원)에서 사용할 수 있는 “사용자 API” 사양에서 가져온 것입니다. 이에 대한 자세한 내용은 다음 링크에서 확인할 수 있습니다: User API keys specification

@david SSO를 사용 중이며, 사용자가 앱에서 로그아웃할 때 Discourse에서도 해당 사용자를 로그아웃시키고 싶습니다. 현재 '관리자 API’를 사용하여 /users/by-external/${id}.json을 통해 사용자 ID를 가져오고 있지만 CORS 오류가 발생합니다. 이 로그아웃 과정만을 위해 모든 사용자에게 '사용자 API’를 활성화하고 싶지 않은데, 어떻게 하시겠습니까?

관리자 API 요청을 보내는 주체는 무엇인가요? 클라이언트 애플리케이션의 JavaScript인가요?

클라이언트 JavaScript에 관리자 API를 포함해서는 안 됩니다. 클라이언트를 사용하는 모든 사람이 사이트의 관리자 권한에 접근할 수 있게 되기 때문입니다.

네, 제 앱에는 JavaScript가 사용되고 있네요. 이해합니다. 그러면 대안은 무엇인가요? 한 사용자를 위한 'user API’를 추가하고, 그 API를 통해 모든 사용자를 위한 호출을 수행할 수 있을까요?

사용자 API를 사용하는 경우, 사용자별로 처리해야 합니다. 키를 공유해서는 안 됩니다.

하지만 여기에서 가장 일반적인 방법은 앱의 서버 측에서 이를 처리하는 것입니다. 서버는 CORS 문제 없이 관리자 API 키를 사용하여 요청을 보낼 수 있으며, 보안상의 우려도 적습니다(안전하게 구현된 경우).

@david 감사합니다. 도움이 많이 됐어요. 그렇게 처리하겠습니다. 다시 한번 감사합니다.

안녕하세요 @david, 백엔드 솔루션을 구현해 보았지만 https://example.com/users/by-external/{EXTERNAL_USER_ID}.json?api_key={DISCOURSE_API_KEY}&api_username=system을 호출하면 로그인 페이지의 HTML이 반환됩니다(로그인 페이지로 리다이렉트되는 것으로 추측됩니다). login required 설정이 활성화되어 있으며, 이 설정을 비활성화하면 올바른 JSON 응답을 받을 수 있습니다. 해당 설정은 활성화된 상태로 유지하고 싶은데, 무슨 문제가 있는지 아이디어가 있을까요?

API 키와 사용자 이름에는 헤더를 사용해야 합니다. 자세한 내용은 http://docs.discourse.org/ 를 확인하세요.

그렇게 하니까 해결됐어요. 다시 한번 감사드립니다. :+1: