Каждое устройство - отдельный клиент и получает свою пару токенов. В отдельную таблицу базы пишутся записи (id_пользователя, refresh_токен, время_окончания_токена, статус).
При запросе обновления если этот токен отмечен в базе как использованный, то все токены клиента удаляются из базы как скомпрометированные и возвращается требование аутентификации по логину/паролю.
Если токен просрочен или его нет в базе, то возвращается требование аутентификации по логину/паролю.
Если токен есть в базе и ещё не использован, то токен отмечается как использованный и выдаётся новая пара токенов.
Периодически из базы удаляются токены с истёкшим сроком действия.