API를 통해 이메일 로그인 링크를 보낼 수 있나요?

안녕하세요! Discourse API를 사용하게 되어 정말 기쁩니다!

API 역공학 가이드를 따라가던 중 로그인 링크를 보내는 API 호출에서 문제가 발생했습니다.

왜 이 작업을 하고 있는지에 대한 배경
저는 로컬 해커스페이스의 사용자가 해커스페이스 멤버십 시스템으로 우리의 Discourse에 로그인할 수 있도록 SSO 서비스를 만들었습니다.

하지만 일부 사용자는 멤버십 시스템과 Discourse에 서로 다른 이메일 주소를 사용했을 수 있습니다. SSO가 활성화되면 로컬 로그인이 비활성화되므로, 사용자들이 "로그인 링크를 이메일로 보내기"를 클릭하여 로그인할 수 있도록 하고, 이후 원하면 이메일 주소를 업데이트하거나(또는 그냥 로그인 링크를 계속 사용하거나) 할 수 있기를 원합니다.

목표
API를 통해 user @ domain .co.uk 사용자에게 로그인 링크를 보내고 싶습니다.

다음과 같이 시도해 보았습니다:

curl -X POST "https://discourse.<site>.org.uk/u/email-login" --data "{\"login\":\"user"%"40domain.co.uk\"}" -H "Api-Key: xxxxx" -H "Api-Username: system" -H "Content-Type: application/json"

반환되는 결과는 다음과 같습니다.

<html><body>You are being <a href="https://discourse.<site>.org.uk/">redirected</a>.</body></html>

API 키를 포함하지 않으면 [BAD CSRF]가 반환됩니다.

즉, 제가 막혀 있는 부분은 API를 통해 Discourse가 user @ domain .co.uk 사용자에게 로그인 링크를 이메일로 보내는 방법입니다.

도움을 주시면 감사하겠습니다. 계속 시도해 보며 어떤 것이 작동하는지 확인해 보겠습니다.


P.S. 다음과 같은 해킹 방식은 피하고 싶습니다:
/session/csrf에 요청을 보내 CSRF 토큰을 저장한 다음,
CSRF 토큰과 함께 /u/email-login에 요청을 보내는 방식.

API 키만으로 이 작업을 수행할 수 있을까요?

감사합니다!
:slight_smile:

추가로 여쭤볼 것이 있는데, CSRF 라우트를 먼저 거친 후 이메일 링크 라우트를 사용하는 것이 올바른 방식인가요?

API 키가 제공된 경우 API에 해당 구현이 없나요?

SSO 서비스가 Discourse와 어떻게 연동되나요? DiscourseConnect를 사용 중이라면, /u/email-login 엔드포인트가 비활성화될 것으로 생각됩니다.

답변해 주셔서 감사합니다. 그리고 네, Discourse Connect를 사용하고 있습니다.

저도 그렇게 생각했기 때문에 Discourse Connect를 비활성화하고 로그인 링크를 보내달라고 시도해 보았지만, 작동하지 않아서 위에 올려둔 포스트에 있는 출력을 얻게 되었습니다.

Discourse Connect가 활성화되어 있을 때 이메일 링크 수신 기능이 비활성화되는 것이라면, 멤버십 시스템 SSO 서비스에서 Discourse 계정을 연결하는 방법에 대해 접근 방식을 다시 생각해 봐야 할 것 같습니다.

말씀하신 대로 가장 쉬운 방법은 이메일 주소로 계정을 매칭하는 것입니다. 이것이 불가능할 경우, 우리는 다음과 같은 몇 가지 접근 방식을 사용합니다:

  1. 다른 고유 식별자를 사용하여 사용자를 매칭합니다. 콘솔을 통해 사용자의 DiscourseConnect 연관 관계를 사전에 생성할 수 있습니다. 이는 Discourse와 Identity Provider(신원 제공자) 간에 일관된 다른 식별자가 있는 경우에만 작동합니다.

  2. (가장 일반적인 방법) 사용자가 새 계정에 가입하도록 허용한 다음, 관리자에게 메시지를 보내 새 계정을 기존 계정으로 "병합"해 달라고 요청하도록 합니다(사용자 관리자 페이지 하단의 버튼을 사용). 그러면 이메일이 자동으로 매칭되고 DiscourseConnect 연관 관계가 생성됩니다.

답변 주셔서 감사합니다.

계정 통합 방식이 아마 제가 선택할 방향이 될 것 같습니다.

이 과정을 셀프 서비스로 처리할 수 있다면 훌륭한 기능이 될 것 같습니다. 예를 들어, 사용자가 이메일 링크를 통해 로그인한 후 이메일 주소를 업데이트하여 두 계정을 동기화할 수 있는 API를 제공하는 방식이라든가, 사용자가 Discourse 이메일과 비밀번호를 제공하면서 업데이트된 이메일 주소를 함께 입력하여 본인 인증을 하는 방식도 가능합니다.

다시 한번 시간 내어 주셔서 감사합니다.