Осмелюсь написать свое виденье реализации локальной аутентификации с использованием серверной части. Рассмотрим самый банальный вариант, когда пользователь устанавливает пин код на вход в приложение. Для этого он в авторизованной зоне вводит свои четыре нуля, а мы делаем запрос в API на генерацию refresh токена (при этом пин пользователя не покидает периметр девайса, но device-id там присутвует). После чего, мы формируем из пина пользователя ключ (по всем правилам), которым шифруем refresh токен и складываем, например, в префы. При этом на стороне сервера не забываем настроить лимиты на попытки и срок жизни. В результате, когда пользователь хочет войти в приложение, он вводит пин, мы генерируем ключ, расшифровываем refresh токен и обмениваем его на access токен. Профит
Этот подход подвержен брутфорсу пина. Мы можем локально перебрать все 10к вариантов и в итоге расшифровать токен