Summary
After updating drupal/simple_oauth, /admin/reports/status shows:
Entity/field definitions: Mismatched entity and/or field definitions OAuth2 token
The Scopes field needs to be updated.
Steps to reproduce
Steps to reproduce
Have a site with simple_oauth already installed (any version prior to the one where setDisplayOptions() was added to the scopes field).
Update simple_oauth to a version where Oauth2Token::baseFieldDefinitions() sets ->setDisplayOptions('view', ...) and ->setDisplayOptions('form', ...) on the scopes field (see src/Entity/Oauth2Token.php).
Run drush updatedb / visit /update.php. No pending hook_update_N or post_update function addresses this.
Visit /admin/reports/status. The "Entity/field definitions" section reports the mismatch and never clears.
Root cause
simple_oauth.install and simple_oauth.post_update.php contain no update hook that calls EntityDefinitionUpdateManager::updateFieldStorageDefinition() for the scopes field's new display options. Comparing the installed field storage definition against the current code-level definition confirms the only difference is the display key (view/form options) — the actual SQL schema (columns, indexes) is unchanged, so this isn't a data-affecting change, just a metadata sync that Drupal's entity system doesn't auto-detect (similar in nature to the core limitation noted in https://www.drupal.org/project/drupal/issues/3005447 and previously hit by this same module in https://www.drupal.org/project/simple_oauth/issues/3320581 for the Token field's index).
Proposed resolution
Add an update hook along these lines:
/**
* Refreshes the oauth2_token scopes field storage definition.
*/
function simple_oauth_update_XXXX(): void {
$definition_update_manager = \Drupal::entityDefinitionUpdateManager();
$storage_definition = \Drupal::service('entity_field.manager')
->getFieldStorageDefinitions('oauth2_token')['scopes'] ?? NULL;
if ($storage_definition) {
$definition_update_manager->updateFieldStorageDefinition($storage_definition);
}
}Note: fetching the definition via $definition_update_manager->getFieldStorageDefinition() (as done for a similar, unrelated purpose elsewhere) returns the already-installed (stale) definition rather than the current code-level one, so it does not clear this mismatch — the fix needs to source the definition from entity_field.manager instead.
Issue fork simple_oauth-3624864
Show commands
Start within a Git clone of the project using the version control instructions.
Or, if you do not have SSH keys set up on git.drupalcode.org:
Comments
Comment #4
andres alvarez commentedConfirmed the root cause.
simple_oauth_update_8605()uninstalls and reinstalls thescopesbase field onoauth2_token, but the reinstalled definition omits the view/formsetDisplayOptions()calls present inOauth2Token::baseFieldDefinitions(). Any site that ran that update ends up with an installed field storage definition out of sync with the code-level definition.Added
update_8609()to callupdateFieldStorageDefinition()and resync the scopes field, plus a kernel test that reproduces the stale definition and confirms the update fixes it. Test fails without the fix and passes with it. MR opened.Comment #5
andres alvarez commentedComment #6
vidit.anjaria commented