관리자가 아닌 사용자가 자신의 API 키를 발급할 수 있나요?

안녕하세요 :waving_hand:,

GitHub Action을 통해 Discourse 포럼에 게시글을 올리는 작업을 하고 있습니다.
게시글 API를 찾았으나, 문서에는 Discourse 사용자는 관리자 패널에서 API 키를 생성해야 합니다라고 적혀 있습니다. 하지만 일반 사용자는 관리자 패널에 접근할 수 없죠. 이에 대해 몇 가지 질문이 있습니다:

  • 일반 사용자를 위해 API 키가 설계되어 있나요?
  • 그렇다면 일반 사용자는 어떻게 자신의 API 키를 생성할 수 있나요?
  • 그렇다면 일반 사용자에게 API 키 기능을 활성화하기 위해 필요한 설정이 있나요?
    • 포럼의 설정 페이지에는 API 키를 생성할 수 있는 인터페이스가 없습니다. 따라서 사용자가 자신의 API 키를 발급받을 수 있도록 허용하는 특정 설정이 있을 것이라 추측합니다.

미리 감사드립니다! :folded_hands:

안녕하세요 @KengoTODA, 여기 오신 것을 환영합니다! :slight_smile: :wave:

User API keys specification 링크가 말씀하신 내용에 도움이 될 것입니다.

감사합니다! ‘API 키 생성 플로우’ 부분을 확인해 보았습니다.

auth_redirect URL을 제공할 수 있는 웹 애플리케이션을 위한 것임을 이해했습니다.
CLI나 GitHub Actions를 위한 권장 방법이 있을까요?

GitHub Action용으로 사용하신다면, 필요한 작업만 허용하는 스코프된 API 키를 생성하는 것이 더 좋습니다. 하지만 이 키를 생성하려면 관리자 권한이 필요합니다.

CLI 프로그램의 경우, 이 방법이 필요할 경우 로컬 웹 서버를 실행하고 http://localhost:XXXXX/callback URL을 사용할 수 있습니다. 이 앱도 비슷한 방식으로 동작합니다.

좋아요, 한번 해볼게요. 도움 주셔서 감사합니다!

Generate User API Keys for testing 주소를 참고하여 사용자 API를 생성할 수 있습니다.

저는 이 브랜치에서 작업 중이며, 리다이렉트 URL로 localhost를 사용하여 명령어를 성공적으로 실행했습니다. 그러나 승인 버튼을 클릭한 후, https://meta.discourse.org/user-api-key 페이지에서 JS 오류가 발생하여 작업을 계속 진행할 수 없었습니다. ruby 스크립트는 작동하지만, auth_redirect 파라미터를 추가하면 실패합니다.

브라우저 콘솔에 보고된 예외는 다음과 같습니다:

Uncaught TypeError: Cannot set property 'isReadOnly' of undefined
    at Function.createCurrent (_application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js:44867)
    at Function.current (_application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js:8816)
    at Object.initialize (_application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js:70403)
    at Object.i.initialize (_application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js:7001)
    at _ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:49660
    at i.each (_ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:67904)
    at i.walk (_ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:67891)
    at n.each (_ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:67858)
    at n.topsort (_ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:67758)
    at t._runInitializer (_ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js:49667)

JS 코드 분석에 대한 스크린샷을 첨부하겠습니다. siteAttribtues가 적절한 값을 가져야 하지만 undefined인 것 같습니다. 조언이 있으시다면 알려주세요. 감사합니다!

해당 문제를 조사하고 있습니다.

/user-api-key의 POST 메서드가 403을 반환하기 때문에 JS에서 오류가 발생합니다. 컨트롤러의 build_not_found_page 메서드는 미리 로드된 값을 저장하는 preload_anonymous_data 메서드를 호출하지 않기 때문입니다.

auth_redirect 파라미터를 추가했을 때 서버가 <h1 class="title">Oops! That page is private.</h1>와 함께 403을 반환한 이유는 정확히 알 수 없습니다. 크로스 사이트 스크립팅 문제를 확인하기 위해 콜백 URL에 동일한 도메인과 HTTPS 프로토콜을 사용해 보았지만, 해결되지 않았습니다.

도메인(및 경로)을 allowed user api auth redirects 사이트 설정에 추가해야 합니다.

HTTP 요청을 수동으로 보내는 경우, discourse://auth_redirect가 작동해야 합니다.

감사합니다. config in the site_settings.yml에서 설정을 찾아서 제 요청이 403 오류를 반환한 이유를 이해했습니다.

discourse://auth_redirect가 제 예상대로 동작하지 않아서, ruby 코드와 마찬가지로 사용자가 암호화된 토큰을 수동으로 입력하도록 안내해 보겠습니다.

다른 사용자들을 위한 참고: npx 명령을 통해 실행할 수 있는 노드 모듈을 만들었습니다. 이 모듈은 write 범위의 API 키를 생성합니다. Discourse API 토큰이 필요한 시스템의 설정 과정에 도움이 되길 바랍니다.

수정: @KengoTODA 님, 안녕하세요. 님의 GitHub 코드가 올바른 방향으로 나아가는 데 큰 도움이 되었습니다. 아직 몇 가지 세부 사항을 정리하고 있으며, 완료되면 어떻게 동작하게 만들었는지 간단히 정리해 올리겠습니다.

@KengoTODA 님의 GitHub 코드가 큰 도움이 되었습니다. 이제 사용자별로 인증하여 Discourse에 API 호출을 할 수 있는 동작하는 버전을 만들었습니다. 제가 작성한 단계는 여기에 있습니다: User API keys specification - #45 by JQ331