pfaffman
(Jay Pfaffman)
12월 4, 2024, 8:56오후
1
이것은 버그인 것 같은데, 왜 내가 첫 번째로 불평하는 사람이 되는지 이해가 안 됩니다. 그런데 Google 인증은 Meta에서 잘 작동하거든요…
YML 파일의 ENV 변수에 Google 인증을 설정한 여러 사이트가 있습니다. 수년 동안 잘 작동해 왔는데, 오늘 한 사이트가 갑자기 작동하지 않게 되었습니다. 다른 두 사이트는 여전히 잘 작동했습니다. 해당 사이트들을 업그레이드한 후, 이제는 모든 사이트에서 다음 메시지가 반환됩니다:
죄송합니다. 계정 인증 중 오류가 발생했습니다. 다시 시도해 주세요.
첫 번째 사이트가 작동하지 않았을 때 Google 측 문제인 줄 알았는데, 올바른 URL은 여전히 그대로 있습니다.
google-protobuf가 무엇인지 모르겠습니다. 이것이 관련이 있을까요? Build(deps): Bump google-protobuf from 4.28.3 to 4.29.0 (#29969) · discourse/discourse@996f993 · GitHub (수정: 아니요. 그럴 수 없습니다: “Protobuf.dev는 Google의 쿠키를 사용하여 서비스 품질을 제공하고 향상시키며 트래픽을 분석합니다”)
수정: 음, 로그에는 "(google_oauth2) Authentication failure! authenticity_error: OmniAuth::AuthenticityError, Forbidden"라고 나와 있으니, Google이 제 자격 증명을 싫어하는 것 같습니다.
이 자격 증명은 다른 사이트들이 사용 중인 것과 동일하며, 해당 사이트들도 마지막 업그레이드 전에 이 자격 증명을 사용했습니다. /var/www/discourse/config/discourse.conf와 Rails의 SiteSettings에서 예상 값이 표시되는 것을 확인했습니다.
ENV를 통해 설정하는 대신 사이트 설정(Site Settings)에서 설정하면 동작이 달라질까요?
/logs의 트레이스백을 게시해 주실 수 있나요?
pfaffman
(Jay Pfaffman)
12월 4, 2024, 9:20오후
3
discourse.conf 파일을 편집하고 site-settings를 통해 설정을 해보겠습니다.
Message (4 copies reported)
(google_oauth2) Authentication failure! authenticity_error: OmniAuth::AuthenticityError, Forbidden
Backtrace
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2/lib/active_support/broadcast_logger.rb:134:in `block in error'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2/lib/active_support/broadcast_logger.rb:231:in `block in dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2/lib/active_support/broadcast_logger.rb:231:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2/lib/active_support/broadcast_logger.rb:231:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2/lib/active_support/broadcast_logger.rb:134:in `error'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/omniauth-2.1.2/lib/omniauth/strategy.rb:163:in `log'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/omniauth-2.1.2/lib/omniauth/strategy.rb:540:in `fail!'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/omniauth-2.1.2/lib/omniauth/strategy.rb:261:in `rescue in request_call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/omniauth-2.1.2/lib/omniauth/strategy.rb:233:in `request_call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/omniauth-2.1.2/lib/omniauth/strategy.rb:193:in `call!'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/omniauth-2.1.2/lib/omniauth/strategy.rb:169:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/omniauth-2.1.2/lib/omniauth/builder.rb:44:in `call'
/var/www/discourse/lib/middleware/omniauth_bypass_middleware.rb:43:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-2.2.10/lib/rack/tempfile_reaper.rb:15:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-2.2.10/lib/rack/conditional_get.rb:40:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-2.2.10/lib/rack/head.rb:12:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/actionpack-7.2.2/lib/action_dispatch/http/permissions_policy.rb:38:in `call'
/var/www/discourse/lib/content_security_policy/middleware.rb:12:in `call'
/var/www/discourse/lib/middleware/anonymous_cache.rb:399:in `call'
/var/www/discourse/lib/middleware/csp_script_nonce_injector.rb:12:in `call'
/var/www/discourse/config/initializers/008-rack-cors.rb:14:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-2.2.10/lib/rack/session/abstract/id.rb:266:in `context'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-2.2.10/lib/rack/session/abstract/id.rb:260:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/actionpack-7.2.2/lib/action_dispatch/middleware/cookies.rb:704:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/actionpack-7.2.2/lib/action_dispatch/middleware/callbacks.rb:31:in `block in call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2/lib/active_support/callbacks.rb:101:in `run_callbacks'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/actionpack-7.2.2/lib/action_dispatch/middleware/callbacks.rb:30:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/actionpack-7.2.2/lib/action_dispatch/middleware/debug_exceptions.rb:31:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/actionpack-7.2.2/lib/action_dispatch/middleware/show_exceptions.rb:32:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/logster-2.20.0/lib/logster/middleware/reporter.rb:40:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/railties-7.2.2/lib/rails/rack/logger.rb:41:in `call_app'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/railties-7.2.2/lib/rails/rack/logger.rb:29:in `call'
/var/www/discourse/config/initializers/100-quiet_logger.rb:20:in `call'
/var/www/discourse/config/initializers/100-silence_logger.rb:29:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/actionpack-7.2.2/lib/action_dispatch/middleware/request_id.rb:33:in `call'
/var/www/discourse/lib/middleware/enforce_hostname.rb:24:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-2.2.10/lib/rack/method_override.rb:24:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/actionpack-7.2.2/lib/action_dispatch/middleware/executor.rb:16:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-2.2.10/lib/rack/sendfile.rb:110:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-mini-profiler-3.3.1/lib/mini_profiler.rb:191:in `call'
/var/www/discourse/lib/middleware/processing_request.rb:12:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/message_bus-4.3.8/lib/message_bus/rack/middleware.rb:60:in `call'
/var/www/discourse/lib/middleware/request_tracker.rb:360:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/actionpack-7.2.2/lib/action_dispatch/middleware/remote_ip.rb:96:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/railties-7.2.2/lib/rails/engine.rb:535:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/railties-7.2.2/lib/rails/railtie.rb:226:in `public_send'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/railties-7.2.2/lib/rails/railtie.rb:226:in `method_missing'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-2.2.10/lib/rack/urlmap.rb:74:in `block in call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-2.2.10/lib/rack/urlmap.rb:58:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-2.2.10/lib/rack/urlmap.rb:58:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/unicorn-6.1.0/lib/unicorn/http_server.rb:634:in `process_client'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/unicorn-6.1.0/lib/unicorn/http_server.rb:739:in `worker_loop'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/unicorn-6.1.0/lib/unicorn/http_server.rb:547:in `spawn_missing_workers'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/unicorn-6.1.0/lib/unicorn/http_server.rb:143:in `start'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/unicorn-6.1.0/bin/unicorn:128:in `<top (required)>'
/var/www/discourse/vendor/bundle/ruby/3.3.0/bin/unicorn:25:in `load'
/var/www/discourse/vendor/bundle/ruby/3.3.0/bin/unicorn:25:in `<main>'
Env
HTTP HOSTS: looks.right.to.me.com
verbose 로깅을 사용하면 더 많은 정보가 제공된다는 점이 명확하지 않습니다.
현재 무관한 이유로 사이트 중 하나를 다시 구축하고 있습니다.
pfaffman
(Jay Pfaffman)
12월 4, 2024, 9:37오후
4
오 마이 갓. 방금 다른 업그레이드를 실행했는데 작동하네요.
그리고 다른 사이트도 업그레이드했는데 그것도 작동합니다. 커밋이나 제 코드에서 이런 현상을 설명할 수 있는 건 아무것도 보이지 않아요. 보통은 적어도 내가 문제의 원인이라는 걸 입증할 수 있는데 말이죠.
pfaffman
(Jay Pfaffman)
12월 5, 2024, 2:43오후
5
아쉬워라. 그리고 이제 아무것도 변하지 않았는데, 어제 오후에 두 사이트를 모두 재구성해서 "수정"했을 때는 잘 작동하던 것이 지금은 둘 다
죄송합니다. 계정을 인증하는 동안 오류가 발생했습니다. 다시 시도해 주세요.
라는 오류를 표시하고 있습니다.
변화된 것은 두 컨테이너에 진입하여 /var/www/discourse/plugins/discourse-data-explorer/plugins.rb 파일을 편집하고 sv restart unicorn 명령을 실행했다는 점입니다.
그러면 유니콘(unicorn)을 재시작하는 것이 어떤 식으로든 문제를 일으킬 수 있을까요? 말이 안 되네요. 컨테이너를 재시작하고 싶지 않은데, 두 컨테이너 모두 앞으로 30~40시간 동안 장시간 가져오기 작업을 수행하고 있기 때문입니다.
pfaffman
(Jay Pfaffman)
12월 5, 2024, 5:13오후
6
이것이 단서가 될 수 있습니다. 언급된 각 오류에 대해 OmniAuth::AuthenticityTokenProtection에 의해 차단된 공격도 하나씩 보고되고 있습니다.
Message (8 copies reported)
Attack prevented by OmniAuth::AuthenticityTokenProtection
Backtrace
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2/lib/active_support/broadcast_logger.rb:130:in `block in warn'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2/lib/active_support/broadcast_logger.rb:231:in `block in dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2/lib/active_support/broadcast_logger.rb:231:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2/lib/active_support/broadcast_logger.rb:231:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2/lib/active_support/broadcast_logger.rb:130:in `warn'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/omniauth-2.1.2/lib/omniauth/authenticity_token_protection.rb:26:in `deny'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-protection-3.2.0/lib/rack/protection/base.rb:57:in `react'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/omniauth-2.1.2/lib/omniauth/authenticity_token_protection.rb:18:in `call!'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/omniauth-2.1.2/lib/omniauth/authenticity_token_protection.rb:11:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/omniauth-2.1.2/lib/omniauth/strategy.rb:240:in `request_call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/omniauth-2.1.2/lib/omniauth/strategy.rb:193:in `call!'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/omniauth-2.1.2/lib/omniauth/strategy.rb:169:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/omniauth-2.1.2/lib/omniauth/builder.rb:44:in `call'
/var/www/discourse/lib/middleware/omniauth_bypass_middleware.rb:43:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-2.2.10/lib/rack/tempfile_reaper.rb:15:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-2.2.10/lib/rack/conditional_get.rb:40:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-2.2.10/lib/rack/head.rb:12:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/actionpack-7.2.2/lib/action_dispatch/http/permissions_policy.rb:38:in `call'
/var/www/discourse/lib/content_security_policy/middleware.rb:12:in `call'
/var/www/discourse/lib/middleware/anonymous_cache.rb:399:in `call'
/var/www/discourse/lib/middleware/csp_script_nonce_injector.rb:12:in `call'
/var/www/discourse/config/initializers/008-rack-cors.rb:14:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-2.2.10/lib/rack/session/abstract/id.rb:266:in `context'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-2.2.10/lib/rack/session/abstract/id.rb:260:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/actionpack-7.2.2/lib/action_dispatch/middleware/cookies.rb:704:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/actionpack-7.2.2/lib/action_dispatch/middleware/callbacks.rb:31:in `block in call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2/lib/active_support/callbacks.rb:101:in `run_callbacks'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/actionpack-7.2.2/lib/action_dispatch/middleware/callbacks.rb:30:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/actionpack-7.2.2/lib/action_dispatch/middleware/debug_exceptions.rb:31:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/actionpack-7.2.2/lib/action_dispatch/middleware/show_exceptions.rb:32:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/logster-2.20.0/lib/logster/middleware/reporter.rb:40:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/railties-7.2.2/lib/rails/rack/logger.rb:41:in `call_app'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/railties-7.2.2/lib/rails/rack/logger.rb:29:in `call'
/var/www/discourse/config/initializers/100-quiet_logger.rb:20:in `call'
/var/www/discourse/config/initializers/100-silence_logger.rb:29:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/actionpack-7.2.2/lib/action_dispatch/middleware/request_id.rb:33:in `call'
/var/www/discourse/lib/middleware/enforce_hostname.rb:24:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-2.2.10/lib/rack/method_override.rb:24:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/actionpack-7.2.2/lib/action_dispatch/middleware/executor.rb:16:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-2.2.10/lib/rack/sendfile.rb:110:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-mini-profiler-3.3.1/lib/mini_profiler.rb:191:in `call'
/var/www/discourse/lib/middleware/processing_request.rb:12:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/message_bus-4.3.8/lib/message_bus/rack/middleware.rb:60:in `call'
/var/www/discourse/lib/middleware/request_tracker.rb:360:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/actionpack-7.2.2/lib/action_dispatch/middleware/remote_ip.rb:96:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/railties-7.2.2/lib/rails/engine.rb:535:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/railties-7.2.2/lib/rails/railtie.rb:226:in `public_send'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/railties-7.2.2/lib/rails/railtie.rb:226:in `method_missing'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-2.2.10/lib/rack/urlmap.rb:74:in `block in call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-2.2.10/lib/rack/urlmap.rb:58:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-2.2.10/lib/rack/urlmap.rb:58:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/unicorn-6.1.0/lib/unicorn/http_server.rb:634:in `process_client'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/unicorn-6.1.0/lib/unicorn/http_server.rb:739:in `worker_loop'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/unicorn-6.1.0/lib/unicorn/http_server.rb:547:in `spawn_missing_workers'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/unicorn-6.1.0/lib/unicorn/http_server.rb:143:in `start'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/unicorn-6.1.0/bin/unicorn:128:in `<top (required)>'
/var/www/discourse/vendor/bundle/ruby/3.3.0/bin/unicorn:25:in `load'
/var/www/discourse/vendor/bundle/ruby/3.3.0/bin/unicorn:25:in `<main>'
Env
HTTP HOSTS: six.imports.literatehosting.com
물론이죠!
저는 스택의 이 부분을 건드리지 않아서 잘 모르겠습니다… 다만…
Jay Pfaffman:
omniauth-2.1.2
이 버전은 어떻게 설치하셨나요? Discourse가 고정된 버전은 1.9.2입니다.
호환성 문제일 수도 있습니다. 여기에서 뭔가… 비정상적인… 작업을 하고 계신 건가요?
pfaffman
(Jay Pfaffman)
12월 6, 2024, 1:47오전
8
와! 버전을 알아채셨군요!
그게 맞아요! (아마도)
vim을 설치하기 위해 apt update를 실행했는데, 특히 tiny_tds를 가져오기(Import) 위해 설치했습니다. 그래서 제가 업그레이드한 어떤 패키지가 omniauth 업그레이드를 강제했을 수도 있겠네요.
아니요. 그게 아닙니다. Gemfile.lock을 삭제했기 때문에 bundle install을 실행했을 때 omniauth가 업그레이드된 것 같습니다.
그러니까 이건 귀찮은 문제가 아니라, 오히려 새로운 omniauth의 문제를 찾는 데 정말 도움이 될 수도 있겠네요.
omniauth만 업그레이드해서 재현해 볼 수 있을지 확인해 보겠습니다. Gemfile.lock만 삭제하고 bundling을 실행해 보는 것도 방법일까요?
아. 아마도 IMPORT=1 설정이 내가 생각했던 것보다 더 중요했던 이유일지도 모르겠네요.
수정: 네. 분명히 tiny_tds를 가져오기(Import) 위해 bundle install을 실행한 것이 원인인 것 같습니다. IMPORT=1은 다른 문제를 일으키기 때문에 평소에는 잘 사용하지 않습니다. OmniAuth 업그레이드가 문제를 일으키는 것인지 확인해 보겠지만, 그럴 가능성이 매우 높아 보입니다.
그렇게 하시는 순간 이 모든 것이 더 이상 지원되지 않게 됩니다. 주요 gem 버전 업그레이드는 테스트가 필요한 부분이라, 문제가 발생하신 것에 대해 놀랍지 않습니다.
(제가 아는 한) 우리가 가져오기(import)를 수행할 때는 데이터를 제자리에 배치하는 데 필요한 작업을 수행한 후, 백업을 만들어 이를 깨끗한 사이트(clean site)에 복원합니다.
다른 조건이 모두 같다면, 우선 그 방법을 시도해 보시는 것이 좋습니다.
pfaffman
(Jay Pfaffman)
12월 6, 2024, 10:16오전
10
맞아요! 그 버전을 알아봐 주셔서 감사합니다!
버전을 올리지 않고 tiny tds를 설치하는 방법에 대해 정확히 확신이 서지 않습니다(아마 IMPORT=1이 해결해 줄지도 모르겠지만), 하지만 적어도 이제 그 이유를 알게 되었습니다. 그리고 이것이 왜 새 컨테이너를 빌드하면 문제가 해결되는지 설명해 줍니다.
그걸 알아봐 주셔서 정말 감사합니다. 거의 미칠 뻔했습니다.
아마 be 버전에는 다른 파라미터나 뭔가가 있어서 설정을 아예 받지 못하는 것 같습니다.