Как вручную отозвать токен 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)
Поскольку вы специально спрашивали об отзыве всех токенов для пользователя (без упоминания приложений), у вас есть следующие варианты:
- Вызовите его один раз для идентификатора приложения, который вы хотите отозвать (должно быть хорошо, если у вас очень мало идентификаторов приложений), или
- Вызовите его один раз, но передайте массив из нескольких идентификаторов приложений вместо одного (я не проверял это, но, посмотрев на источник, он должен работать), или
- Измените метод для удаления области видимости по идентификатору приложения.
Код для этого метода небольшой и его легко понять, если вам нужно его настроить.
Ответ @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.