플러그인에서 ActiveSupport::MessageEncryptor::InvalidMessage 오류 발생

2.9.0.beta5로 업데이트하면서 대시보드 플러그인에서 문제가 발생하고 있습니다. 플러그인의 특정 뷰에서 오류가 트리거되고 있습니다:

Started GET "/pfaffmanager/servers" for 73.147.117.173 at 2022-06-14 17:53:31 +0000
Processing by Pfaffmanager::ServersController#index as HTML
  Rendered default/empty.html.erb within layouts/application (Duration: 0.1ms | Allocations: 29)
  Rendered layout layouts/application.html.erb (Duration: 21.6ms | Allocations: 7109)
Completed 200 OK in 142ms (Views: 23.0ms | ActiveRecord: 0.0ms | Allocations: 37464)
Started GET "/chat/chat_channels.json" for 73.147.117.173 at 2022-06-14 17:53:31 +0000
Processing by DiscourseChat::ChatChannelsController#index as JSON
Started GET "/presence/get?channels%5B%5D=%2Fchat-user%2Fchat%2F1&channels%5B%5D=%2Fchat-user%2Fcore%2F1" for 73.147.117.173 at 2022-06-14 17:53:31 +0000
Processing by PresenceController#get as JSON
  Parameters: {"channels"=>["/chat-user/chat/1", "/chat-user/core/1"]}
Completed 200 OK in 44ms (Views: 1.9ms | ActiveRecord: 0.0ms | Allocations: 5134)
Started GET "/pfaffmanager/servers" for 73.147.117.173 at 2022-06-14 17:53:31 +0000
Completed 200 OK in 94ms (Views: 0.3ms | ActiveRecord: 0.0ms | Allocations: 22124)
Processing by Pfaffmanager::ServersController#index as JSON
Completed 500 Internal Server Error in 113ms (ActiveRecord: 0.0ms | Allocations: 15487)
ActiveSupport::MessageEncryptor::InvalidMessage (ActiveSupport::MessageEncryptor::InvalidMessage)
(eval):9:in `_fast_attributes'
app/controllers/application_controller.rb:543:in `render_json_dump'
app/controllers/application_controller.rb:415:in `block in with_resolved_locale'
app/controllers/application_controller.rb:415:in `with_resolved_locale'
lib/middleware/omniauth_bypass_middleware.rb:71:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:368:in `call'
config/initializers/008-rack-cors.rb:25:in `call'
config/initializers/100-quiet_logger.rb:23:in `call'
config/initializers/100-silence_logger.rb:31:in `call'
lib/middleware/enforce_hostname.rb:23:in `call'
lib/middleware/request_tracker.rb:202:in `call'

이 문제는 내 플러그인의 인덱스 뷰에서만 발생하며, 플러그인의 다른 페이지나 Discourse의 다른 페이지에서는 발생하지 않는 것으로 보입니다. 어디서부터 확인해야 할지 모르겠습니다. 다행히 먼저 스테이징 사이트에서 업그레이드를 실행했습니다!

위 내용으로 보아 채팅 플러그인과 관련이 있을 것 같지만, 채팅 플러그인이 설치되지 않은 내 개발 인스턴스에서도 같은 문제가 발생합니다.

놀랍게도 Google에서 ActiveSupport::MessageEncryptor::InvalidMessage "fast_attributes"를 검색하면 이 토픽만 나옵니다!

내 문제는 config/master.key(https://stackoverflow.com/questions/54277392/rails-activesupportmessageencryptorinvalidmessage)와 관련이 있는 것 같지만, 왜 이번 업그레이드부터 이런 문제가 발생했는지 이해가 되지 않습니다.

Rails 7로 업데이트했기 때문에, 아마 그쪽이 원인일 겁니다.

감사합니다, @gerhard!

에서 다음 내용을 찾았습니다.

(하지만 여기에는 Rails 7.1이라고 되어 있네요?)

기존 플러그인에서 이 변경 사항을 무시할 수 있는, 알고 보면 자명한 plugin.rb 한 줄 코드가 있는지 혹시 바로 아시는 게 있을까요?

아니면 이 변경 사항이 무엇을 의미하는지 직접 파악해야 할 수도 있겠네요.

수정: dev 환경에서 해당 줄을 config/application.rb에 추가해도 마법처럼 해결되지 않습니다.

죄송합니다. 조금 더 아래를 읽어보니:

그래서 이것이 제 즉각적인 문제를 해결해 줄 수도 있겠네요. 다시 한번 도움을 주셔서 감사합니다! 이번에는 성공할 수 있을지도 모르겠네요.


음, Rails 6과 Rails 7 모두에서 생성한 키는 다음과 같이 보입니다:

#<ActiveSupport::KeyGenerator:0x000055870212d4f8 @hash_digest_class=OpenSSL::Digest::SHA1, @iterations=65536, @secret="my-big-secret">

하지만 암호화 방식은 다릅니다. hash_digest_class가 문제인 줄 알았는데, 적어도 양쪽에서 동일해 보이는데도 암호화된 문자열은 다릅니다. :crying_cat_face:

아, 실망이네요. 아니, 그게 아닙니다. 정상적으로 작동하는 프로덕션 사이트는 7.0.3이고, 문제가 있는 스테이징 사이트도 7.0.3입니다. 암호화 방식이 다르게 적용되고 있습니다. 직렬화기(serializer)가 다른 건지, 아니면 암호화 알고리즘(cypher)이 다른 건지 구분할 수 없고, 어떻게 확인해야 하는지도 모르겠습니다.

그동안 Rails 7.0이 암호화된 필드를 지원한다는 것을 알게 되었습니다. 이 기능을 사용하면 커스텀 코드를 제거할 수 있을 텐데, 암호화된 API 키에 접근하는 방법만 알면 좋겠습니다. 아니면 아예 키를 삭제하고 다시 생성하는 것도 방법일 것 같습니다.

최근에는 다음과 같은 형태의 암호화 결과를 얻고 있습니다.
=> "SUNBZlRURThEZjdVUG8wTzV1eWk0dz09LS1uRGVSQWtPRU9rc1ZCa1Y1d2pyeU5nPT0=--43eab316e6a9ebafc72d4982347abd9c7f6605db"

2.9.0.beta4에서는 다음과 같은 형태였습니다. "FwL/GGvrDHOpQ1bnGiI=--kCLbUxMf/XeMaeWF--/feRN+/l1q3EFdKgyIo+7Q==

여기에 기존 암호화 방식을 추가해야 했습니다:

k = ActiveSupport::MessageEncryptor.new(KEY,  cipher: "aes-256-cbc")

7.0.3으로 실행 중이라고 주장하는 두 인스턴스가 왜 서로 다른 결과를 내는지 여전히 이해가 가지 않지만, 업그레이드 문서를 꼼꼼히 살펴본 것이 큰 도움이 되었습니다. 게르하르트, 감사합니다. 제가 필요했던 자극이었습니다.