몇 년 전에 설정된 이 Docker 때문에, 현재 Droplet을 삭제하고 처음부터 다시 설정하는 것으로 시작할 것 같습니다. 완료하고 테스트한 후 다시 보고드리겠습니다.
좋은 계획이네요. 대부분의 커뮤니티에는 최신 Discourse 기능과 버그 수정을 제공해 주는 기본 tests-passed 브랜치를 유지하는 것을 권장합니다. 마지막 안정 버전 이후 인증 관련 부분이 많이 변경되었기 때문에, 알아서 정상 작동하기 시작하는 것을 발견하게 될 수도 있습니다.
@david, 오늘 시간을 내서 다시 시도해 보았습니다. 이제 새로 설치한 Discourse를 사용 중입니다(제안해 주신 대로 stable-passed 최신 버전).
이전과 마찬가지로 플러그인을 사용하여 다음 설정으로 OAuth2를 설정했습니다:
oauth2 client id: MY-CLIENT-ID
oauth2 client secret: MY-CLIENT-SECRET
oauth2 authorize url: https://MY-NEON-ID.z2systems.com/np/oauth/auth
oauth2 token url: https://www.z2systems.com/np/oauth/token
수동으로 형식화된 URL을 사용하면 다음 오류가 표시됩니다(새로운 오류):
Authorization timed out, or you have switched browsers. Please try again.
그리고 로그에 익숙한 오류가 나타납니다:
(oauth2_basic) Authentication failure! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected
반면에 Discourse 로그인 창에서 OAuth2 버튼을 사용하면 다음이 표시됩니다:
Oops
The software powering this discussion forum encountered an unexpected problem. We apologize for the inconvenience.
Detailed information about the error was logged, and an automatic notification generated. We'll take a look at it.
/logs에 다음과 같은 오류도 기록됩니다:
ArgumentError (Invalid URI: ) /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/excon-0.71.0/lib/excon.rb:126:in `new'
그리고
Failed to handle exception in exception app middleware : Invalid URI:
@david 님, 이전에 제안해 주신 oauth2_user_json_url 설정과 oauth2_fetch_user_details 비활성화 방법을 시도해 보았는데, 시도한 후 다음과 같은 (새로운) 오류들이 발생했습니다:
ActiveRecord::NotNullViolation (PG::NotNullViolation: ERROR: null value in column “provider_uid” violates not-null constraint
DETAIL: Failing row contains (1, oauth2_basic, null, null, 2019-12-19 01:00:49.076659, {}, {“token”: “9607”, “expires”: false}, {}, 2019-12-19 01:00:49.077107, 2019-12-19 01:00:49.077107).
)
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.1.4/lib/patches/db/pg.rb:69:in `async_exec_params’
Failed to handle exception in exception app middleware : PG::NotNullViolation: ERROR: null value in column “provider_uid” violates not-null constraint
DETAIL: Failing row contains (1, oauth2_basic, null, null, 2019-12-19 01:00:49.076659, {}, {“token”: “9607”, “expires”: false}, {}, 2019-12-19 01:00:49.077107, 2019-12-19 01:00:49.077107).
그리고 당연히 평소와 같은 오류도 나옵니다:
(oauth2_basic) Authentication failure! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected
하지만 마지막 오류(CSRF Detected)에서 env 탭을 확인해 보니 다음과 같이 표시되어 있습니다:
hostname forum-app
process_id 762
application_version db7d00a8dce2cc1f7b9d86192cde1f55dd57408b
HTTP_HOST forum.efao.ca
hostname이 HTTP_HOST 이름과 일치하지 않는 것이 정상인가요? 이것이 CSRF 오류가 나는 원인일 수 있을까요?
데니스, 안녕하세요.
해결되셨나요?
저도 같은 오류가 발생했어요:
ActiveRecord::NotNullViolation (PG::NotNullViolation: ERROR: null value in column “provider_uid” violates not-null constraint
어떻게 해결하셨나요?
감사합니다,
Beam
데니스와 제가 확인해 본 결과, NeonCRM은 실제로 OAuth2 스펙을 제대로 따르지 않는 것 같습니다. user_id를 access_token 변수 안에 보내고 있는데, 이 값은 실제 액세스 토큰으로 사용할 수 없습니다.
따라서 oauth2_fetch_user_details를 비활성화하고, oauth2_callback_user_id_path를 token(OAuth2 Ruby 라이브러리가 내부적으로 사용하도록 이름을 변경하기 때문에 access_token이 아닙니다)으로 설정해야 합니다.
이렇게 하면 기능이 정상적으로 동작하지만, 사용자 이메일/이름을 가져올 수 있는 방법은 없습니다.
데니스, 안녕하세요.
저는 Mattermost를 사용하고 있어서 동작 방식이 조금 다릅니다.
하지만 데니스님의 정보를 덕분에 설정을 더 자세히 살펴볼 수 있었고, 결국 잘 작동하게 만들었습니다. 감사합니다!!
Mattermost를 Discourse의 oauth2 제공자로 사용할 때 제 설정은 다음과 같습니다:
검색 엔진을 위해 설정 내용을 텍스트로 정리하면 다음과 같습니다:
oauth2 client id: <mattermost oauth2 제공자 설정에서 가져온 client id>
oauth2 client secret: <mattermost oauth2 제공자 설정에서 가져온 client secret>
oauth2 authorize url:https://chat.animalrebellion.org/oauth/authorize
oauth2 token url:https://chat.animalrebellion.org/oauth/access_token
oauth2 token url method: POST
oauth2 callback user id path:
oauth2 callback user info paths
oauth2 fetch user details: 체크됨
oauth2 user json url:https://chat.animalrebellion.org/api/v4/users/me
oauth2 user json url method: GET
oauth2 json user id path: id
oauth2 json username path: username
oauth2 json name path: username
oauth2 json email path: email
oauth2 json email verified path: email_verified
oauth2 json avatar path:
oauth2 email verified: 체크됨
Mattermost 쪽에서는 콜백 URL이 다음과 같이 설정되어 있습니다:
https://base.animalrebellion.org/auth/oauth2_basic/callback
여전히 first_name과 last_name을 "json name path"의 full_name으로 합치는 방법을 보고 싶지만, "username"이나 “first_name” 속성만 사용하는 것으로도 만족할 수 있습니다.
도움이 되길 바랍니다.
감사합니다!
Beam
관련 리소스 링크:
플러그인 링크: GitHub - discourse/discourse-oauth2-basic: A basic OAuth2 plugin for use with Discourse · GitHub
Discourse 플러그인 설치 방법 링크: Install plugins on a self-hosted site
@Beam, 작동하게 되어 기뻐요!
