doorkeeper-gem / doorkeeper

Doorkeeper is an OAuth 2 provider for Ruby on Rails / Grape.
https://doorkeeper.gitbook.io/guides/
MIT License
5.32k stars 1.06k forks source link

Doorkeeper is loading ActiveRecord too early #1703

Open ngan opened 5 months ago

ngan commented 5 months ago

Steps to reproduce

We found a weird behavior as we were upgrading Rails (7.0 => 7.1). When upgrading Rails, it generates a file called config/initializers/new_framework_defaults.rb where it sets a bunch of Rails.application.config.x.y = :something in preparation for changing Rails defaults to the latest version.

We noticed that some of these configs, especially the ones in config.active_record.X did not take hold. Meaning, they did not change the behavior of ActiveRecord. We dug into this further and found out that this happens when gem loads ActiveRecord too early. Here's a Rails issue describing the problem: https://github.com/rails/rails/issues/50133. There's even work (in Rails) towards warning when this happens: https://github.com/rails/rails/pull/46047

For Doorkeeper, specifically, we traced it down to here: https://github.com/doorkeeper-gem/doorkeeper/blob/1cc7145ba195cd48a703abfb904b11fbdeff0aa1/lib/doorkeeper/config.rb#L440-L442

Calling access_token_model will constantize the configured class and essentially loads an autoloaded model that lives inside app/models/.. within the application. The problem is that this method is invoked very early in the setup phase of the doorkeeper gem:

=> https://github.com/doorkeeper-gem/doorkeeper/blob/main/lib/doorkeeper/orm/active_record.rb#L41 from https://github.com/doorkeeper-gem/doorkeeper/blob/main/lib/doorkeeper.rb#L160-L172 from https://github.com/doorkeeper-gem/doorkeeper/blob/main/lib/doorkeeper/engine.rb#L23-L25

I've created a repo to help illustrate the problem. The README has the information. https://github.com/ngan/doorkeeper-activerecord-load-issue

tachyons commented 3 months ago

I've opened a PR to address this issue here