API를 통해 user_api_keys 값을 가져오는 방법

안녕하세요, user_api_keys에 대해 질문이 있습니다. 현재 저희 앱에 Discourse의 user_api_keys를 인증 목적으로 통합하는 작업을 진행 중입니다. 제 질문은 API를 통해 user_api_keys를 조회할 수 있는 방법이 있는지입니다.

현재 /session.json을 통해 로그인하고 /users/:username.json으로 현재 사용자 프로필을 확인하면 사용자가 user_api_keys를 가지고 있는지 여부는 알 수 있지만, 실제 값은 반환되지 않습니다:

"user_api_keys": [
  {
    "id": 0,
    "application_name": "",
    "scopes": [""],
    "created_at": "",
    "last_used_at": ""
  }
]

user_api_keys의 값을 얻고자 하는 이유는, 사용자가 첫 번째 로그인 시 버튼을 클릭하여 이미 인증을 승인한 후에도 두 번째 인증 승인을 다시 요구하는 것을 방지하기 위해서입니다.

아니요, API 키는 한 번만 표시되고 이후에는 해시만 저장됩니다.

사용자 API 키는 앱에, 가능하면 최종 사용자의 기기에 저장해야 합니다. 사용자 API 키가 존재하는 이유는 사용자가 인가의 '증거’를 가지고 있으며, 그 키를 저장하는 책임이 있기 때문입니다.

API를 통해 API 키의 값을 가져올 수 있다고 생각하지 않습니다. Discourse는 데이터베이스에 암호화되지 않은 API 키를 저장하지 않습니다. 암호화된 값을 가져올 수 있다 해도, 해당 값을 애플리케이션에서 복호화할 방법이 없습니다.

사용 사례를 좀 더 자세히 설명해 주실 수 있을까요? 이미 사용자를 위한 API 키가 생성된 상태라면, 왜 사용자가 두 번째로 인가 승인을 해야 하는지 제게는 명확하지 않습니다.

수정: 관리자 API 키를 사용하여 사용자의 API 키를 생성하는 것이 가능합니다. 이에 대한 세부 사항은 다음 링크에서 확인할 수 있습니다: Generate User Api Key Without User Approval - #2 by simon

내 게시물을 다시 읽어보니, 요청에서 $json 변수가 어떻게 설정되었는지 설명하지 않았다는 것을 알았습니다. 데이터 구조를 파악하는 가장 쉬운 방법은 Discourse UI를 통해 원하는 범위로 단일 사용자 API 키를 생성하는 요청을 한 다음, /admin/api/keys로 전송되는 요청 페이로드의 값을 확인하는 것입니다:

안녕하세요 @RGJ, 답변 감사합니다.

Hi @simon, 답변해 주셔서 감사합니다. 저희 상황을 좀 더 자세히 설명드리겠습니다.

저희는 Discourse 엔드포인트의 백엔드 로직에 의존하는 모바일 앱을 개발하고 있습니다. 사용자가 앱을 통해 로그인하면 로그인 데이터가 session.json을 통해 Discourse API로 전송되고, 이 API는 쿠키를 반환합니다. 이 쿠키는 웹뷰를 /user-api-key/new로 리디렉션하여 사용자가 승인하도록 프롬프트하는 데 사용됩니다. 승인 후 페이로드가 복호화되어 API 키로 변환됩니다.

이 경우, 모바일 앱 내에서 API 키를 전역 토큰으로 사용하여 다른 Discourse 엔드포인트에 액세스할 수 있습니다. 그러나 사용자가 로그아웃하면 토큰이 전역 상태(global state)에서 제거되어야 하며, 이를 통해 새 토픽 생성과 같은 엔드포인트에 액세스할 수 없도록 해야 합니다.

제 질문은 이 토픽과 관련되어 있습니다: 사용자가 이미 user_api_keys를 가지고 있는지, 그리고 그것들이 여전히 활성 상태인지 어떻게 확인할 수 있을까요? 키가 존재하고 활성 상태라면, 사용자는 로그인 후 이를 사용할 수 있어야 합니다. 그렇지 않다면, 사용자는 새로운 user_api_keys를 생성해야 하며, 이는 웹뷰에서의 승인을 필요로 합니다.

제가 직면한 주요 문제는 이 부분입니다.

How to Retrieve User API Keys Value via API 게시물에 기반하여 고려한 또 다른 해결책은 API 키를 저희 모바일 앱의 데이터베이스에 저장하는 것입니다.

또한 Generate User API Key Without User Approval - #2 by simon 게시물도 참고했습니다. 이 게시물은 처음에 API 키 구현을 위해 살펴본 자료였습니다. 그러나 문제는 여전히 동일합니다: /admin/api/keys를 확인해도 데이터베이스에 이미 저장된 API 키의 값을 가져오거나 사용자별 API 키를 조회할 수 없습니다. 저는 이 구현을 위해 API 키를 저희 자체 데이터베이스에 저장해야 한다고 생각합니다.

API 키와 별도로 세션 토큰을 생성하는 것이 어떨까요? 이 토큰을 사용하여 사용자의 로그인 상태를 표시할 수 있습니다. 이렇게 하면 사용자가 로그아웃할 때 API 키를 삭제할 필요가 없습니다.

이 문제에 대해 의견을 주셔서 감사합니다. 토큰을 두 곳에 저장하는 것이 더 좋다는 데 동의합니다. 첫째, 사용자의 로그인 상태를 확인하기 위해 전역 상태에 저장하고, 둘째, user_api_keys를 저장하기 위해 데이터베이스에 저장하는 것입니다.

왜 discourse connect를 사용하지 않나요? 인증을 위한 올바른 방법입니다.

안녕하세요, 제안을 주셔서 감사합니다. 여기서 Discourse Connect를 사용하지 않는 이유는 다른 웹사이트나 외부 서비스와 Discourse를 연결하지 않기 때문입니다. 모든 로그인 기능은 Discourse를 통해 직접 처리되며, 앱은 오직 Discourse와만 상호작용합니다.

여러분의 앱은 또 다른 곳이죠. 여러분이 Discourse Connect 클라이언트로 앱을 설정하여 사람들이 Discourse에 로그인함으로써 여러분의 앱에도 로그인할 수 있도록 하기를 원한다고 꽤 확신합니다. 그런 다음 여러분의 앱이 Discourse와 상호작용할 수 있을 것 같습니다. 아니면 아마도 제가 앱이 어떻게 작동하는지 이해하지 못하고 있는 걸 수도 있겠네요.