KeyChain. Аккаунт пользователя

Так или иначе, все реже можно найти приложение, которое не требует создания аккаунта для полноценной работы. В связи с этим возникает необходимость в некоторого рода защищенном хранилище аутентификационных данных. В iOS для этих целей используется framework Security и его сервис KeyChain. Далее будет описан подход для работы с этим сервисом.
Данные пользователя
Как сказано в документации, хранилище используется для безопасного хранения небольших объемов данных. Поэтому требуется некоторый объект Credentials, содержащий информацию об аккаунте, и с которым впоследствии будет происходить работа.
Сформируем минимальные необходимые требования к защищенному хранилищу.
- Возможность сохранить данные.
- Возможность загрузить данные.
- Возможность удалить данные.
В то же время сформулируем основные ограничения к коду.
- Объект должен формировать четкую и понятную абстракцию. Причем уровень абстракции должен соблюдаться и внутри методов.
- Объект должен быть инкапсулирован, предоставляя другим объектам лишь несколько методов для вызова, скрывая внутреннюю реализацию.
В результате работы над данными требованиями и ограничениями был разработан класс KeyChain.
Как можно убедиться, требования к хранилищу реализованы с помощью следующего интерфейса.
init()
func save(credentials: Credentials) throws
func load(credentials: inout Credentials) throws
func remove(credentials: Credentials) throws
Все что касается ограничений, связанных с кодированием, опытный читатель может проанализировать самостоятельно.
Таким образом, при завершении срока действия токена авторизации и наличии в хранилище аккаунта пользователя, не будет необходимости в отображении экрана авторизации. Достаточно будет загрузить аккаунт из хранилища и авторизовать пользователя повторно.
Причем можно повторить подход, который используется в Apple — объявить общий экземпляр (singleton), либо передать объект в окружение (environmentObject), либо, как приводится в примере, создать экземпляр по необходимости.
Заключение
Хранение авторизационных данных — довольно частая задача, которая решается разработчиками, поскольку токен авторизации через определенное время утрачивает актуальность. Для того, чтобы пользовательский опыт был максимально положительным, нужно выполнять повторную авторизацию в “тихом” режиме, а не выбрасывать пользователя на экран ввода логина и пароля.
В любом случае, это один из наиболее распространенных вариантов использования защищенного хранилища. В качестве другого примера можно привести хранение “секретов” пользователя. Но об этом как-нибудь в другой раз.