Discourse OpenID Connect (OIDC)

Hi @balazsorban44, 이 이슈에 대한 리마인드 감사합니다. PR 리뷰를 1차로 마쳤습니다. 만약 저자가 이 부분 작업을 할 시간이 없다면, 우리가 직접 진행할 수 있을 것 같습니다. PKCE 지원이 추가되면 좋겠다는 의견에 동의합니다.

다만, 참고할 점이 있습니다: PKCE가 보호하는 “인가 코드 가로채기” 공격에 대해 Discourse가 취약하다고 생각하지 않습니다. Discourse 인증은 항상 브라우저 내에서 https를 통해 이루어지며, 다른 앱에 의해 가로채질 수 있는 OS 레벨의 커스텀 URL 스킴을 사용하지 않기 때문입니다.

물론, 추가적인 보안 계층을 추가하는 데는 아무런 해가 없습니다. :+1:

3개의 좋아요

보안에는 반드시 신경 쓸 필요는 없습니다.

여기서 피드백을 반영했으며, 원래 기여자의 이력을 유지하여 공로를 인정했습니다: feat: PKCE support - Pull Request #86 - discourse/discourse-openid-connect - GitHub

이 작업을 마무리하는 데 기꺼이 협력하겠습니다 :slight_smile:

2개의 좋아요

이 문제에 대한 해결책을 찾으신 적이 있으신가요?

안타깝게도, 아닙니다.

@swt2c 플러그인에 다음을 추가하여 직접 구현했습니다.

  params << ["client_id", "<my-client-id>"]
  params << ["logout_uri", post_logout_redirect] if post_logout_redirect

plugin.rb 파일의 params << ["post_logout_redirect_uri", post_logout_redirect] if post_logout_redirect 줄 뒤에 추가했습니다.

공식 지원이 이루어지면 좋겠습니다!

@balazsorban44 이 문제를 맡아 주셔서 감사합니다! 방금 PR을 병합했으니, 이제 플러그인에 옵트인 방식의 PKCE 지원 기능이 추가되었습니다 :tada:

4개의 좋아요

크리스님,
이 플러그인에 Authentik을 어떻게 통합하셨나요? 어떤 정보든 도움이 될 것 같습니다. 몇 주 동안 제대로 작동시키는 데 애를 먹고 있습니다.

음, 특별히 기억나는 건 없네요. 정확히 어떤 문제가 발생하고 있나요? 설정 화면의 스크린샷을 공유해 주시겠어요 (혹시 DM으로 보내 주셔도 됩니다)?

1개의 좋아요

답장 주셔서 감사합니다, 크리스. 네, 알겠습니다. 이번 주 후반에 authentik을 맡았던 개발 팀원들이 함께 있을 때 다시 연락드리겠습니다. 주요 문제는 플로우와 아웃포스트에서 발생하고 있습니다.

1개의 좋아요

흥미로운 문제가 있습니다. 공개 배포 전에 모든 것이 정상적으로 작동하는지 테스트하려면, OIDC 제공자를 로컬(프라이빗 서브넷)에 호스팅하고 인터넷에서 접근할 수 없도록 설정해야 합니다.
하지만 Discourse가 프라이빗 IP로 연결하는 것을 허용하지 않기 때문에 이 작업이 실패합니다.
oidc.example.org가 프라이빗 IP로 해석됩니다.

OIDC Log: Fetching discovery document from https://oidc.example.org/application/o/discourse/.well-known/openid-configuration
OIDC Log: Fetching discovery document raised error Faraday::ConnectionFailed FinalDestination: all resolved IPs were disallowed
OIDC Log: Discovery document is

---

(oidc) Request phase initiated.
(oidc) Authentication failure! openid_connect_discovery_error: OmniAuth::OpenIDConnect::DiscoveryError, Discovery document is missing

openid_connect_discovery_document는 관리자만 변경할 수 있으므로, 이를 신뢰하고 프라이빗 IP도 허용해야 한다고 생각합니다.

이름이 'allowed_internal_hosts’인 사이트 설정이 있습니다. 이 목록에 내부 호스트명을 추가하면 해당 요청은 SSRF Detector를 통과할 수 있습니다.

공유 호스팅 서비스(공식 discourse.org 호스팅 등)의 경우, 관리자가 호스팅 환경 내에서 요청을 수행하도록 신뢰하지 않기 때문에 이 보호 기능이 기본적으로 존재합니다.

죄송합니다만, 플러그인을 설치하라는 지침을 정확히 이해하지 못하겠습니다. 저는 로컬 Docker 환경에서 Discourse를 실행 중인데, 설정을 추가할 app.yml 파일을 찾을 수가 없습니다.
어리석은 질문일 수 있지만, 로컬 개발 환경에서 설치하는 방법에 대한 가이드가 있을까요?

Docker 개발 환경의 경우, /var/discourse/containers/app.yml 파일을 확인해 보세요.
다만, Docker를 사용하지 않는 개발 설치 환경의 경우, 다음 링크를 참고하세요:

1개의 좋아요

문제는 폴더 containers를 찾을 수 없다는 것입니다.

만약 이 가이드를 따랐다면, 플러그인을 설치하려면 이 게시글을 참고해 보시는 건 어떨까요?

안녕하세요.
해당 플러그인을 추가했는데 정상적으로 작동합니다. 제가 확인한 문제는, 저희 discourse 앱에 별칭(aliases)이 있어 2개의 URL로 로그인할 수 있다는 점입니다. 두 URL 모두 Azure에 적절한 콜백 URL로 설정되어 있습니다. 그런데 https://discourse.company.com/auth/oidc 호출 시, 별칭 URL이 포함된 Location URL을 반환하는 것을 확인했습니다. 예: https://login-blah-bla/authorize?client_id=&redirect_uri=https%3A%2F%[2Fdiscourse.us.company.com](http://2fdiscourse.us.company.com/)%2Fauth%2Foidc%2Fcallback.
원래 요청이 발생한 URL을 존중해야 하지 않나요?

openid_connect_error_redirects라는 설정이 있지만, 이는 오류 발생 시를 위한 것으로 생각합니다. 리다이렉트를 authority(즉, discourse.company.com)로 변경하는 방법에 대해 아이디어가 있을까요?

수동으로 bundle install을 실행하면 다음과 같은 메시지가 표시됩니다:

Post-install message from oauth2:

You have installed oauth2 version 1.4.11, which is EOL.
No further support is anticipated for the 1.4.x series.

그리고 oauth2 버전 2로 업그레이드하라는 권고도 함께 나옵니다. 이런 메시지가 없으면 훨씬 마음이 편할 텐데, 업그레이드 계획이 있으신가요?

또한 다음과 같은 메시지도 표시됩니다:

You have installed oauth version 1.1.0, congratulations!

Non-commercial support for the 1.x series will end by April, 2025. Please make a plan to upgrade to the next version prior to that date.
The only breaking change will be dropped support for Ruby 2.7 and any other versions which will also have reached EOL by then.

하지만 이건 당신 쪽의 문제가 아닐 것 같네요?

안녕하세요,
‘Allow new registrations’ 옵션은 플러그인 작동에 필수적입니다. 이 옵션을 활성화하면 Discourse에 처음 로그인할 때 계정이 자동으로 생성되고 ‘register’ 버튼이 표시됩니다. 하지만 이 옵션을 비활성화할 수 있도록 할 수 있을까요? 즉, openidconnect를 통해 로그인하는 사용자에게 설정을 수정하거나 계정을 직접 생성할 수 있는 권한을 주지 않는 것입니다. 이렇게 하면 이 컨텍스트에서 불필요한 ‘register’ 버튼을 화면에서 제거할 수 있습니다.
감사합니다.

해결하셨나요? 같은 메시지에서 막혀 있어요.

안녕하세요, 이걸 설정하셨나요? 왜 이렇게 막혀 있는지 모르겠어요. OpenID나 auth로 관리해본 앱이 수백 개인데, 이 앱이 제일 까다롭네요.