SPA에서 Discourse 사용자와 협업하기

SPA에서 Discourse를 통해 사용자별 데이터를 가져오는 방법을 찾고 있습니다.

대략적인 설정

  • SPA: my-app.com에서 실행
  • Discourse: community.my-app.com에서 실행

SPA에는 자체 사용자 관리 기능이 없습니다. Discourse를 사용자 관리에 사용하려고 합니다(자체 사용자 관리가 필요한 다른 사용자별 기능이 없기 때문입니다).

하지만 Discourse의 현재 로그인된 사용자를 SPA에 표시하고, 예를 들어 읽지 않은 주제 위젯(사용자별 데이터)을 표시하기 위해 Discourse에서 API를 통해 데이터를 로드해야 합니다.

시도해 본 것들:

  • Discourse SSO 경로를 사용하여 SPA로 리다이렉트하는 방식. 이렇게 하면 현재 사용자의 이메일 주소, 외부 ID 등을 가져올 수 있지만, 요청을 수행할 수 있는 토큰/키는 제공되지 않습니다.
  • Discourse 쿠키를 사용하여 요청을 보낼 수 있도록 쿠키 설정을 조정해 보았으나 성공하지 못했습니다.
  • https://meta.discourse.org/t/user-api-keys-specification/48536에서 사용자 API 키에 대해 읽었으나, 같은 사이트인 앱이 자신의 Discourse 계정에 접근하도록 허용하는 것은 사용자 입장에서 어색할 것 같습니다.

원하는 동작을 구현할 수 있는 방법이 있을까요?

감사합니다.
Marcel

이렇게 하면 될까요?

  1. 설명된 대로 DiscourseConnect(“Discourse SSO”)를 사용하여 현재 사용자의 사용자 이름을 가져옵니다.
  2. 필요한 범위(scope)와 “모든 사용자” 접근 권한을 가진 API 키를 생성합니다.
  3. 당연히 해당 키를 클라이언트 측 웹 앱에 전달하면 사이트가 위험에 노출되므로, 웹 앱의 요청을 해당 앱의 백엔드를 통해 Discourse 인스턴스로 프록시해야 합니다. (그리고 백엔드에서 사용자 이름이 유효한지 검증해야 합니다 — DiscourseConnect를 자세히 살펴보지는 않았지만, 그렇게 할 수 있는 방법이 있을 것으로 추정됩니다.)

(P.S.: 예시 도메인으로 ‘example.com’ 사용을 권장합니다. 링크한 도메인은 누군가가 구매하여 스팸이나 악성코드 등을 설정할 수 있지만, example.[com|org|net]은 공식적으로 예약된 도메인입니다.)

네, 실제로 제가 현재 구현하고 있는 방식이 바로 그겁니다.

사용자를 SSO를 통해 보내면, 미들웨어가 이름, 이메일, 토큰 배열을 가진 간단한 사용자 객체를 생성하고, 토큰을 만들어 SPA로 반환합니다.

미들웨어는 모든 사용자를 위한 API 키를 사용하여 요청을 Discourse로 프록시하고, “세션 토큰”(어떤 사용자인지 확인하기 위해)을 검증하며, 다른 보안 관련 처리도 수행합니다.

사용자가 로그인 상태를 유지하도록 쿠키/로컬 스토리지를 사용하며, Discourse의 로그아웃 직접 옵션을 통해 로그아웃을 동기화할 예정입니다.

동작은 하지만, 관리자 API 토큰과 사용자명을 조합해서 처리하는 것보다 더 나은 옵션이 있어야 한다고 여전히 생각합니다. 어떤 관리자가 누군가의 사용자명을 변경하면 깨지거든요… 해시 ID나 그런 것이 있으면 좋겠습니다… 하지만 제가 바꿀 수 있는 부분은 아니니, 이대로 살아가겠습니다 :wink:

답변해 주셔서 감사합니다.