Как вручную отозвать токен Doorkeeper?

Скажем, у меня есть пользователь, которого я удалил из моей системы. Я тоже хочу отозвать их токены. Какой лучший способ сделать это? Это так же просто, как сделать что-то вроде

Doorkeeper::AccessToken.where(resource_owner_id: deleted_user.id).each(&:revoke)

или есть лучший подход?

2 ответа

Вы можете сделать это, где application_id является идентификатором приложения Doorkeeper и resource_owner является удаленным пользователем:

Doorkeeper::AccessToken.revoke_all_for(application_id, resource_owner)

Поскольку вы специально спрашивали об отзыве всех токенов для пользователя (без упоминания приложений), у вас есть следующие варианты:

  1. Вызовите его один раз для идентификатора приложения, который вы хотите отозвать (должно быть хорошо, если у вас очень мало идентификаторов приложений), или
  2. Вызовите его один раз, но передайте массив из нескольких идентификаторов приложений вместо одного (я не проверял это, но, посмотрев на источник, он должен работать), или
  3. Измените метод для удаления области видимости по идентификатору приложения.

Код для этого метода небольшой и его легко понять, если вам нужно его настроить.

Ответ @Justin Workman великолепен.

После того, как я проверил орудие revoke_all_for метод

            def revoke_all_for(application_id, resource_owner, clock = Time)
        by_resource_owner(resource_owner)
          .where(
            application_id: application_id,
            revoked_at: nil,
          )
          .update_all(revoked_at: clock.now.utc)
      end

Я обнаружил, что если вы хотите отозвать все токены владельца ресурса независимо от приложения, вы можете просто позвонить:

      Doorkeeper::AccessToken.by_resource_owner(resource_owner).where(revoked_at: nil).update_all(revoked_at: Time.now.utc)

Мы можем сохранить вызов db, который вычисляет все application_ids.

Другие вопросы по тегам